/ Hex Artifact Content
Login

Artifact 2e46e275a9104bbebdaf04bccae3fe47c95d57b2:


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 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1be0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 31 29 3b   OP_Goto, 0, 1);
1bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1c00: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
1c10: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
1c20: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
1c30: 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72 73    if( v && pPars
1c40: 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21 64  e->nErr==0 && !d
1c50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c70: 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1c80: 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69 73  el==0 );  /* Dis
1c90: 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e 61  ables and re-ena
1ca0: 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20  bles match */.  
1cb0: 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20 6f    /* A minimum o
1cc0: 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73 20  f one cursor is 
1cd0: 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74 6f  required if auto
1ce0: 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73 65  increment is use
1cf0: 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69 63  d.    *  See tic
1d00: 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66 30  ket [a696379c1f0
1d10: 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66 28  8866] */.    if(
1d20: 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21 3d   pParse->pAinc!=
1d30: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 61  0 && pParse->nTa
1d40: 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e 6e  b==0 ) pParse->n
1d50: 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  Tab = 1;.    sql
1d60: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
1d70: 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20 20  y(v, pParse);.  
1d80: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
1d90: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1da0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
1db0: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
1dc0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
1dd0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1de0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1df0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Tab = 0;.  pPars
1e00: 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  e->nMem = 0;.  p
1e10: 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b  Parse->nSet = 0;
1e20: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20  .  pParse->nVar 
1e30: 3d 20 30 3b 0a 20 20 44 62 4d 61 73 6b 5a 65 72  = 0;.  DbMaskZer
1e40: 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  o(pParse->cookie
1e50: 4d 61 73 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Mask);.}../*.** 
1e60: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
1e70: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
1e80: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
1e90: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
1ea0: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
1eb0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1ec0: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
1ed0: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
1ee0: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
1ef0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1f00: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
1f10: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
1f20: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
1f30: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
1f40: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
1f50: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
1f60: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
1f70: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
1f80: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
1f90: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
1fa0: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
1fb0: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
1fc0: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
1fd0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
1fe0: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
1ff0: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
2000: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
2010: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
2020: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
2030: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
2040: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
2050: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
2060: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
2070: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
2080: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
2090: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
20a0: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
20b0: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
20c0: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
20d0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
20e0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
20f0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
2100: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
2110: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
2120: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2130: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65  pParse->db;.# de
2140: 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73  fine SAVE_SZ  (s
2150: 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f  izeof(Parse) - o
2160: 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56  ffsetof(Parse,nV
2170: 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65  ar)).  char save
2180: 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20  Buf[SAVE_SZ];.. 
2190: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
21a0: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  r ) return;.  as
21b0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
21c0: 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e  sted<10 );  /* N
21d0: 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e  esting should on
21e0: 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64  ly be of limited
21f0: 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73   depth */.  va_s
2200: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2210: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
2220: 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20  te3VMPrintf(db, 
2230: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
2240: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
2250: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
2260: 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20   return;   /* A 
2270: 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  malloc must have
2280: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
2290: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b   pParse->nested+
22a0: 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65  +;.  memcpy(save
22b0: 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56  Buf, &pParse->nV
22c0: 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  ar, SAVE_SZ);.  
22d0: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
22e0: 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a  nVar, 0, SAVE_SZ
22f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50  );.  sqlite3RunP
2300: 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53  arser(pParse, zS
2310: 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, &zErrMsg);. 
2320: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2330: 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b, zErrMsg);.  s
2340: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2350: 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79   zSql);.  memcpy
2360: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
2370: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
2380: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
2390: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
23a0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
23b0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
23c0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
23d0: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
23e0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
23f0: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2400: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2410: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2420: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2430: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2440: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2450: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2460: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
2470: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
2480: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
2490: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
24a0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
24b0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
24c0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
24d0: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
24e0: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
24f0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2500: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2510: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2520: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2530: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2540: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2550: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2560: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
2570: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
2580: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
2590: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
25a0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
25b0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
25c0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
25d0: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
25e0: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
25f0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2600: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2610: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2620: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2630: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2640: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2650: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2660: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
2670: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2680: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2690: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
26a0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
26b0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
26c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
26d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
26e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
26f0: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2700: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2710: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2720: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2730: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2740: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2750: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2760: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
2770: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
2780: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
2790: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
27a0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
27b0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
27c0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
27d0: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
27e0: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
27f0: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2800: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2810: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2820: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2830: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2840: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2850: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2860: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
2870: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ndif.  for(i=OMI
2880: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
2890: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
28a0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
28b0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
28c0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
28d0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
28e0: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
28f0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2900: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
2910: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2920: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2930: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2940: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
2950: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
2960: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2970: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
2980: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
2990: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
29a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
29b0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
29c0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
29d0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
29e0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
29f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
2a00: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
2a10: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
2a20: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
2a30: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
2a40: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
2a50: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2a60: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
2a70: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2a80: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
2a90: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
2aa0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2ab0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
2ac0: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2ad0: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2ae0: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
2af0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
2b00: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
2b10: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
2b20: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2b30: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2b40: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
2b50: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
2b60: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
2b70: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
2b80: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2b90: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2ba0: 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  * context in whi
2bb0: 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72  ch to report err
2bc0: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ors */.  int isV
2bd0: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  iew,            
2be0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69  /* True if looki
2bf0: 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61  ng for a VIEW ra
2c00: 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c  ther than a TABL
2c10: 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
2c20: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2c30: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2c40: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2c50: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2c60: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2c70: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c80: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2c90: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2ca0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2cb0: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2cc0: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2cd0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2ce0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2cf0: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d00: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d20: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2d30: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2d40: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2d50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2d60: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2d70: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2d80: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2d90: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2da0: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2db0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69  har *zMsg = isVi
2dc0: 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69  ew ? "no such vi
2dd0: 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74  ew" : "no such t
2de0: 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a  able";.    if( z
2df0: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
2e00: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2e10: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
2e20: 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65  s", zMsg, zDbase
2e30: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
2e40: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2e50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2e60: 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73  e, "%s: %s", zMs
2e70: 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  g, zName);.    }
2e80: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
2e90: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
2ea0: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  }.#if SQLITE_USE
2eb0: 52 5f 41 55 54 48 45 4e 49 43 41 54 49 4f 4e 0a  R_AUTHENICATION.
2ec0: 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72 73    else if( pPars
2ed0: 65 2d 3e 64 62 2d 3e 61 75 74 68 2e 61 75 74 68  e->db->auth.auth
2ee0: 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65 72  Level<UAUTH_User
2ef0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2f00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2f10: 22 75 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e  "user not authen
2f20: 74 69 63 61 74 65 64 22 29 3b 0a 20 20 20 20 70  ticated");.    p
2f30: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
2f40: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2f50: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2f60: 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
2f70: 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54  d by *p..**.** T
2f80: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
2f90: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c   around sqlite3L
2fa0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68  ocateTable(). Th
2fb0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2fc0: 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c  ween.** sqlite3L
2fd0: 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64  ocateTable() and
2fe0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2ff0: 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
3000: 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a  tion restricts.*
3010: 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  * the search to 
3020: 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65  schema (p->pSche
3030: 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ma) if it is not
3040: 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d   NULL. p->pSchem
3050: 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d  a may be.** non-
3060: 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61  NULL if it is pa
3070: 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20  rt of a view or 
3080: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
3090: 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a  definition. See.
30a0: 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
30b0: 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69  List() for detai
30c0: 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ls..*/.Table *sq
30d0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
30e0: 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Item(.  Parse *p
30f0: 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73  Parse, .  int is
3100: 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20  View, .  struct 
3110: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3120: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3130: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3140: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
3150: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
3160: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
3170: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
3180: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
3190: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
31a0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
31b0: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
31c0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
31d0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  b].zName;.  }els
31e0: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
31f0: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
3200: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
3210: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
3220: 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e  e, isView, p->zN
3230: 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a  ame, zDb);.}../*
3240: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
3250: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
3260: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
3270: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
3280: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
3290: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
32a0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
32b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
32c0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
32d0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
32e0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
32f0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
3300: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
3310: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
3320: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
3330: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
3340: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
3350: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
3360: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
3370: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
3380: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
3390: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
33a0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
33b0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
33c0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
33d0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
33e0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
33f0: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
3400: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
3410: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
3420: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
3430: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
3440: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
3450: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
3460: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
3470: 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  t i;.  /* All mu
3480: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
3490: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
34a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
34b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
34c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21  /.  assert( zDb!
34d0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
34e0: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
34f0: 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69  s(db) );.  for(i
3500: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
3510: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3520: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
3530: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
3540: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
3550: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53  re MAIN */.    S
3560: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
3570: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68   db->aDb[j].pSch
3580: 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
3590: 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20   pSchema );.    
35a0: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
35b0: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
35c0: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
35d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35f0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3600: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
3610: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
3620: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
3630: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  dxHash, zName);.
3640: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
3650: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
3660: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
3670: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
3680: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
3690: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
36a0: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  reeIndex(sqlite3
36b0: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
36c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36d0: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
36e0: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
36f0: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b  xSamples(db, p);
3700: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
3710: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3720: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
3730: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
3740: 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66  ee(db, p->zColAf
3750: 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52  f);.  if( p->isR
3760: 65 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33  esized ) sqlite3
3770: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
3780: 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51  Coll);.#ifdef SQ
3790: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
37a0: 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c  3_OR_STAT4.  sql
37b0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52  ite3_free(p->aiR
37c0: 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  owEst);.#endif. 
37d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
37e0: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
37f0: 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61  For the index ca
3800: 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68  lled zIdxName wh
3810: 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20  ich is found in 
3820: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62  the database iDb
3830: 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74  ,.** unlike that
3840: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
3850: 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76  Table then remov
3860: 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d  e the index from
3870: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61  .** the index ha
3880: 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65  sh table and fre
3890: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72  e all memory str
38a0: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
38b0: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  ed.** with the i
38c0: 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
38d0: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
38e0: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
38f0: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
3900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
3910: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
3920: 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a  pIndex;.  Hash *
3930: 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74  pHash;..  assert
3940: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
3950: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
3960: 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20  , 0) );.  pHash 
3970: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
3980: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
3990: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
39a0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70  ite3HashInsert(p
39b0: 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20  Hash, zIdxName, 
39c0: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
39d0: 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  (pIndex) ){.    
39e0: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
39f0: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
3a00: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ex ){.      pInd
3a10: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3a20: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
3a30: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
3a40: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
3a50: 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63       /* Justific
3a60: 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28  ation of ALWAYS(
3a70: 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75  );  The index mu
3a80: 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73  st be on the lis
3a90: 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t of.      ** in
3aa0: 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  dices. */.      
3ab0: 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  p = pIndex->pTab
3ac0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  le->pIndex;.    
3ad0: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
3ae0: 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d  p) && p->pNext!=
3af0: 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d  pIndex ){ p = p-
3b00: 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20  >pNext; }.      
3b10: 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20  if( ALWAYS(p && 
3b20: 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78  p->pNext==pIndex
3b30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
3b40: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
3b50: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
3b60: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
3b70: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
3b80: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
3b90: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
3ba0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3bb0: 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74  * Look through t
3bc0: 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  he list of open 
3bd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69  database files i
3be0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20  n db->aDb[] and 
3bf0: 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62  if.** any have b
3c00: 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f  een closed, remo
3c10: 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
3c20: 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61   list.  Realloca
3c30: 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44  te the.** db->aD
3c40: 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f  b[] structure to
3c50: 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c   a smaller size,
3c60: 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a   if possible..**
3c70: 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65  .** Entry 0 (the
3c80: 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65   "main" database
3c90: 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74  ) and entry 1 (t
3ca0: 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61  he "temp" databa
3cb0: 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72  se).** are never
3cc0: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
3cd0: 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e  being collapsed.
3ce0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3cf0: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
3d00: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
3d10: 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  b){.  int i, j;.
3d20: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
3d30: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3d40: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
3d50: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3d60: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
3d70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
3d80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3d90: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
3da0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
3db0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3dc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3dd0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
3de0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
3df0: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
3e00: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
3e10: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
3e20: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
3e30: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3e40: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3e50: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3e60: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3e70: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3e80: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3e90: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3ea0: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3eb0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3ec0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3ed0: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
3ee0: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
3ef0: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
3f00: 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73 63  .** Reset the sc
3f10: 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61 74  hema for the dat
3f20: 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20 69  abase at index i
3f30: 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74 20  Db.  Also reset 
3f40: 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65  the.** TEMP sche
3f50: 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ma..*/.void sqli
3f60: 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d  te3ResetOneSchem
3f70: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  a(sqlite3 *db, i
3f80: 6e 74 20 69 44 62 29 7b 0a 20 20 44 62 20 2a 70  nt iDb){.  Db *p
3f90: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
3fa0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
3fb0: 2f 2a 20 43 61 73 65 20 31 3a 20 20 52 65 73 65  /* Case 1:  Rese
3fc0: 74 20 74 68 65 20 73 69 6e 67 6c 65 20 73 63 68  t the single sch
3fd0: 65 6d 61 20 69 64 65 6e 74 69 66 69 65 64 20 62  ema identified b
3fe0: 79 20 69 44 62 20 2a 2f 0a 20 20 70 44 62 20 3d  y iDb */.  pDb =
3ff0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
4000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4010: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
4020: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
4030: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
4040: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 73  Schema!=0 );.  s
4050: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
4060: 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b  r(pDb->pSchema);
4070: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 64 61  ..  /* If any da
4080: 74 61 62 61 73 65 20 6f 74 68 65 72 20 74 68 61  tabase other tha
4090: 6e 20 54 45 4d 50 20 69 73 20 72 65 73 65 74 2c  n TEMP is reset,
40a0: 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 73 65 74   then also reset
40b0: 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69 6e 63 65   TEMP.  ** since
40c0: 20 54 45 4d 50 20 6d 69 67 68 74 20 62 65 20 68   TEMP might be h
40d0: 6f 6c 64 69 6e 67 20 74 72 69 67 67 65 72 73 20  olding triggers 
40e0: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
40f0: 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a  ables in the.  *
4100: 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  * other database
4110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62  ..  */.  if( iDb
4120: 21 3d 31 20 29 7b 0a 20 20 20 20 70 44 62 20 3d  !=1 ){.    pDb =
4130: 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20   &db->aDb[1];.  
4140: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
4150: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
4160: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
4170: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
4180: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
4190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
41a0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
41b0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
41c0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
41d0: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
41e0: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
41f0: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
4200: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4210: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4220: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
4230: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
4240: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4250: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
4260: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
4270: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
4280: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
4290: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
42a0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
42b0: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
42c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
42d0: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
42e0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
42f0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
4300: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
4310: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c  rnChanges;.  sql
4320: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
4330: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
4340: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
4350: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c  b);.  sqlite3Col
4360: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
4370: 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ay(db);.}../*.**
4380: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4390: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
43a0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
43b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
43c0: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
43d0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
43e0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
43f0: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
4400: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
4410: 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c  Delete memory al
4420: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
4430: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20  column names of 
4440: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  a table or view 
4450: 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43  (the.** Table.aC
4460: 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a  ol[] array)..*/.
4470: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
4480: 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  teDeleteColumnNa
4490: 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mes(sqlite3 *db,
44a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
44b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
44c0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
44d0: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
44e0: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
44f0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
4500: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4510: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
4520: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
4530: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4540: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  e(db, pCol->zNam
4550: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
4560: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4570: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
4580: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4590: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c  e(db, pCol->zDfl
45a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
45b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
45c0: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ->zType);.      
45d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
45e0: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
45f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4600: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4610: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  le->aCol);.  }.}
4620: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
4630: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
4640: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
4650: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
4660: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
4670: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
4680: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
4690: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
46a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
46b0: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
46c0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
46d0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
46e0: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
46f0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
4700: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
4710: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
4720: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
4730: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
4740: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
4750: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
4760: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
4770: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
4780: 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d  .** The db param
4790: 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c  eter is optional
47a0: 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  .  It is needed 
47b0: 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  if the Table obj
47c0: 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ect .** contains
47d0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
47e0: 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63  y.  (Table objec
47f0: 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
4800: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c   do not use.** l
4810: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c  ookaside memory,
4820: 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65   but some epheme
4830: 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
4840: 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a  s do.)  Or the.*
4850: 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63  * db parameter c
4860: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
4870: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4880: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
4890: 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62  memory.** used b
48a0: 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  y the Table obje
48b0: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
48c0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73  te3DeleteTable(s
48d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
48e0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
48f0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
4900: 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ext;.  TESTONLY(
4910: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b   int nLookaside;
4920: 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20 76 65   ) /* Used to ve
4930: 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20 6e  rify lookaside n
4940: 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63 68 65  ot used for sche
4950: 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ma */..  assert(
4960: 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54 61 62   !pTable || pTab
4970: 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  le->nRef>0 );.. 
4980: 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74   /* Do not delet
4990: 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69  e the table unti
49a0: 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  l the reference 
49b0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
49c0: 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 54  ro. */.  if( !pT
49d0: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
49e0: 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64 62   if( ((!db || db
49f0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4a00: 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d  0) && (--pTable-
4a10: 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65 74 75  >nRef)>0) ) retu
4a20: 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  rn;..  /* Record
4a30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
4a40: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61  utstanding looka
4a50: 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  side allocations
4a60: 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65   in schema Table
4a70: 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  s.  ** prior to 
4a80: 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29  doing any free()
4a90: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69   operations.  Si
4aa0: 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65  nce schema Table
4ab0: 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a  s do not use.  *
4ac0: 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69  * lookaside, thi
4ad0: 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20  s number should 
4ae0: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20  not change. */. 
4af0: 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b   TESTONLY( nLook
4b00: 61 73 69 64 65 20 3d 20 28 64 62 20 26 26 20 28  aside = (db && (
4b10: 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73  pTable->tabFlags
4b20: 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
4b30: 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
4b60: 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a 20  ut : 0 );..  /* 
4b70: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
4b80: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4b90: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  th this table. *
4ba0: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
4bb0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
4bc0: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
4bd0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
4be0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
4bf0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
4c00: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  Index->pSchema==
4c10: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
4c20: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 20 7c  );.    if( !db |
4c30: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
4c40: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ed==0 ){.      c
4c50: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e  har *zName = pIn
4c60: 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20  dex->zName; .   
4c70: 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e     TESTONLY ( In
4c80: 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71  dex *pOld = ) sq
4c90: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4ca0: 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65  .         &pInde
4cb0: 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  x->pSchema->idxH
4cc0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20  ash, zName, 0.  
4cd0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
4ce0: 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71  ert( db==0 || sq
4cf0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
4d00: 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64  Held(db, 0, pInd
4d10: 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  ex->pSchema) );.
4d20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
4d30: 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f  ld==pIndex || pO
4d40: 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ld==0 );.    }. 
4d50: 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c     freeIndex(db,
4d60: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20   pIndex);.  }.. 
4d70: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66   /* Delete any f
4d80: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61  oreign keys atta
4d90: 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62  ched to this tab
4da0: 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  le. */.  sqlite3
4db0: 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  FkDelete(db, pTa
4dc0: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  ble);..  /* Dele
4dd0: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
4de0: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
4df0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65 6c 65   */.  sqliteDele
4e00: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
4e10: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
4e20: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4e30: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
4e40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4e50: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
4e60: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
4e70: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
4e80: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
4e90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4ea0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c  OMIT_CHECK.  sql
4eb0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4ec0: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
4ed0: 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 23  Check);.#endif.#
4ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4ef0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
4f00: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65    sqlite3VtabCle
4f10: 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ar(db, pTable);.
4f20: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
4f30: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
4f40: 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  e);..  /* Verify
4f50: 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69   that no lookasi
4f60: 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73  de memory was us
4f70: 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62  ed by schema tab
4f80: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
4f90: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c   nLookaside==0 |
4fa0: 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62  | nLookaside==db
4fb0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74  ->lookaside.nOut
4fc0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   );.}../*.** Unl
4fd0: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61  ink the given ta
4fe0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ble from the has
4ff0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
5000: 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74   delete the.** t
5010: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77  able structure w
5020: 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  ith all its indi
5030: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
5040: 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  keys..*/.void sq
5050: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
5060: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
5070: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
5080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
5090: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
50a0: 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  p;.  Db *pDb;.. 
50b0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
50c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
50d0: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
50e0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
50f0: 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73  TabName );.  ass
5100: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
5110: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
5120: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73  iDb, 0) );.  tes
5130: 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b  tcase( zTabName[
5140: 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72  0]==0 );  /* Zer
5150: 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e  o-length table n
5160: 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ames are allowed
5170: 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   */.  pDb = &db-
5180: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d  >aDb[iDb];.  p =
5190: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
51a0: 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt(&pDb->pSchema
51b0: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e  ->tblHash, zTabN
51c0: 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ame, 0);.  sqlit
51d0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
51e0: 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  , p);.  db->flag
51f0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
5200: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
5210: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
5220: 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  n, return a stri
5230: 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ng that consists
5240: 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20   of the text of 
5250: 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20  that.** token.  
5260: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
5270: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
5280: 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  g.** is obtained
5290: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
52a0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
52b0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
52c0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
52d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f  n..**.** Any quo
52e0: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78  tation marks (ex
52f0: 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65  :  "name", 'name
5300: 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e  ', [name], or `n
5310: 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75  ame`) that.** su
5320: 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20  rround the body 
5330: 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65  of the token are
5340: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20   removed..**.** 
5350: 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e  Tokens are often
5360: 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69   just pointers i
5370: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
5380: 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f   SQL text and so
5390: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30  .** are not \000
53a0: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
53b0: 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65  are not persiste
53c0: 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  nt.  The returne
53d0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c  d string.** is \
53e0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
53f0: 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74  nd is persistent
5400: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
5410: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5420: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
5430: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
5440: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
5450: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
5460: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
5470: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
5480: 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  *)pName->z, pNam
5490: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
54a0: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
54b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
54c0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
54d0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
54e0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
54f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
5500: 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61  ble stored in da
5510: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44  tabase number iD
5520: 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  b for.** writing
5530: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f  . The table is o
5540: 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73  pened using curs
5550: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
5560: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
5570: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69  able(Parse *p, i
5580: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
5590: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
55a0: 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  dbe(p);.  sqlite
55b0: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44  3TableLock(p, iD
55c0: 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  b, MASTER_ROOT, 
55d0: 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  1, SCHEMA_TABLE(
55e0: 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  iDb));.  sqlite3
55f0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5600: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
5610: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69  , MASTER_ROOT, i
5620: 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d  Db, 5);.  if( p-
5630: 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >nTab==0 ){.    
5640: 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d  p->nTab = 1;.  }
5650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
5660: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
5670: 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
5680: 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74  ated buffer cont
5690: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a  aining the name.
56a0: 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ** of a database
56b0: 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
56c0: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
56d0: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
56e0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
56f0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e  n returns the in
5700: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
5710: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
5720: 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31  >aDb[], or.** -1
5730: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5740: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
5750: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5760: 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74  FindDbName(sqlit
5770: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
5780: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
5790: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  t i = -1;       
57a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
57b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e  mber */.  if( zN
57c0: 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70  ame ){.    Db *p
57d0: 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  Db;.    int n = 
57e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
57f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
5800: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5810: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5820: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5830: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f  ){.      if( (!O
5840: 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21  MIT_TEMPDB || i!
5850: 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74  =1 ) && n==sqlit
5860: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e  e3Strlen30(pDb->
5870: 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  zName) && .     
5880: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
5890: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
58a0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
58b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
58c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
58d0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
58e0: 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e  ** The token *pN
58f0: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ame contains the
5900: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
5910: 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69  ase (either "mai
5920: 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20  n" or.** "temp" 
5930: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
5940: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
5950: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5960: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  urns the.** inde
5970: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
5980: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
5990: 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74  Db[], or -1 if t
59a0: 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20  he named db .** 
59b0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
59c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
59d0: 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62  ndDb(sqlite3 *db
59e0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
59f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5a20: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
5a30: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20       /* Name we 
5a60: 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f  are searching fo
5a70: 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  r */.  zName = s
5a80: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5a90: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
5aa0: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    i = sqlite3Fin
5ab0: 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d  dDbName(db, zNam
5ac0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
5ad0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
5ae0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
5af0: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
5b00: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e  iew or trigger n
5b10: 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ame is passed to
5b20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
5b30: 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d  a tokens.** pNam
5b40: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
5b50: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
5b60: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
5b70: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
5b80: 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  e:.**.** CREATE 
5b90: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
5ba0: 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e  ..);.** .** Then
5bb0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5bc0: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
5bd0: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
5be0: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a   other hand if.*
5bf0: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
5c00: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
5c10: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a  alified, i.e.:.*
5c20: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
5c30: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a  E yyy(...);.**.*
5c40: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5c50: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
5c60: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
5c70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5c80: 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55  ne sets the *ppU
5c90: 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f  nqual pointer to
5ca0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
5cb0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a  ken (pName1 or.*
5cc0: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
5cd0: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
5ce0: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
5cf0: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  .  The index of 
5d00: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
5d10: 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65  "xxx" is returne
5d20: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5d30: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20  3TwoPartName(.  
5d40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5d50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
5d60: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
5d70: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
5d80: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
5d90: 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22      /* The "xxx"
5da0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
5db0: 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20  x.yyy" or "xxx" 
5dc0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5dd0: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
5de0: 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d  "yyy" in the nam
5df0: 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20  e "xxx.yyy" */. 
5e00: 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c   Token **pUnqual
5e10: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
5e20: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62  e unqualified ob
5e30: 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a  ject name here *
5e40: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  /.){.  int iDb; 
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
5e70: 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63  olding the objec
5e80: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
5e90: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5ea0: 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
5eb0: 4e 61 6d 65 32 21 3d 30 29 20 26 26 20 70 4e 61  Name2!=0) && pNa
5ec0: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
5ed0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
5ee0: 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  y ) {.      sqli
5ef0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5f00: 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74  se, "corrupt dat
5f10: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 72  abase");.      r
5f20: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
5f30: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
5f40: 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d  Name2;.    iDb =
5f50: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
5f60: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
5f70: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
5f80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5f90: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
5fa0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
5fb0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
5fc0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5fd0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
5fe0: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
5ff0: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
6000: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
6010: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
6020: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
6030: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
6040: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
6050: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6060: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
6070: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
6080: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
6090: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
60a0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
60b0: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
60c0: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
60d0: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
60e0: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
60f0: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
6100: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
6110: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
6120: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
6130: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
6140: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
6150: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
6160: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
6170: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
6180: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
6190: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
61a0: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
61b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
61c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
61d0: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
61e0: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
61f0: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
6200: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
6210: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
6220: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
6230: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
6240: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
6250: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
6260: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
6270: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
6280: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6290: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
62a0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
62b0: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
62c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
62d0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
62e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
62f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6300: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
6310: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
6320: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
6330: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
6340: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
6350: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
6360: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
6370: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21  ->pIndex; p && !
6380: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
6390: 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  x(p); p=p->pNext
63a0: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ){}.  return p;.
63b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
63c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  the column of in
63d0: 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f  dex pIdx that co
63e0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62  rresponds to tab
63f0: 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  le.** column iCo
6400: 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  l.  Return -1 if
6410: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
6420: 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  16 sqlite3Column
6430: 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  OfIndex(Index *p
6440: 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a  Idx, i16 iCol){.
6450: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
6460: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
6470: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
6480: 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61  f( iCol==pIdx->a
6490: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74  iColumn[i] ) ret
64a0: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
64b0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
64c0: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
64d0: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
64e0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
64f0: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
6500: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
6510: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
6520: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
6530: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
6540: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
6550: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6560: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
6570: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
6580: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
6590: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
65a0: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
65b0: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
65c0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
65d0: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
65e0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
65f0: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
6600: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
6610: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
6620: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
6630: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
6640: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
6650: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
6660: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
6670: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
6680: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
6690: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
66a0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
66b0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
66c0: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
66d0: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
66e0: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
66f0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6700: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
6710: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
6720: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
6730: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
6740: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
6750: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
6760: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
6770: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
6780: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
6790: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
67a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
67b0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
67c0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
67d0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
67e0: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
67f0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
6800: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
6810: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
6820: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
6830: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
6840: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
6850: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
6860: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
6870: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
6880: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6890: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
68a0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
68b0: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
68c0: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
68d0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
68e0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
68f0: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
6900: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6910: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
6920: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
6930: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6940: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
6950: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
6960: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6970: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
6980: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
6990: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
69a0: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
69b0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
69c0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
69d0: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
69e0: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
69f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
6a00: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
6a10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6a20: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
6a30: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
6a40: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6a50: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
6a60: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
6a70: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
6a80: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
6a90: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
6aa0: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
6ab0: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  /..  /* The tabl
6ac0: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74  e or view name t
6ad0: 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73  o create is pass
6ae0: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
6af0: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20  ne via tokens.  
6b00: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
6b10: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
6b20: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
6b30: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
6b40: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
6b50: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
6b60: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
6b70: 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20    ** .  ** Then 
6b80: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6b90: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
6ba0: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
6bb0: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20  other hand if.  
6bc0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
6bd0: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
6be0: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
6bf0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
6c00: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
6c10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
6c20: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6c30: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
6c40: 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20  2 is ""..  **.  
6c50: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f  ** The call belo
6c60: 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65  w sets the pName
6c70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
6c80: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
6c90: 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70  pName1 or.  ** p
6ca0: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
6cb0: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
6cc0: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  ed table name. T
6cd0: 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20  he variable iDb 
6ce0: 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74  is.  ** set to t
6cf0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
6d00: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  database that th
6d10: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
6d20: 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72  is to be.  ** cr
6d30: 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20  eated in..  */. 
6d40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6d50: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6d60: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6d70: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  , &pName);.  if(
6d80: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
6d90: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
6da0: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
6db0: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20   pName2->n>0 && 
6dc0: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  iDb!=1 ){.    /*
6dd0: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
6de0: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
6df0: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
6e00: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
6e10: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74   .    ** the dat
6e20: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
6e30: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
6e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6e50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
6e60: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
6e70: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
6e80: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
6e90: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6ea0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
6eb0: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
6ec0: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
6ed0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
6ee0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
6ef0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
6f00: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
6f10: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
6f20: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
6f30: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
6f40: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
6f50: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
6f60: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6f70: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6f80: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
6f90: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
6fa0: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
6fb0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
6fc0: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
6fd0: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
6fe0: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
6ff0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
7000: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
7010: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
7020: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
7030: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
7040: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
7050: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
7060: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
7070: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
7080: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
7090: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
70a0: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
70b0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
70c0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
70d0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
70e0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
70f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7100: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
7110: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
7120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7130: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
7140: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
7150: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
7160: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
7170: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
7180: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7190: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
71a0: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
71b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
71c0: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
71d0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
71e0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
71f0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
7200: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
7210: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7220: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
7230: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
7240: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
7250: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
7260: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
7270: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
7280: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
7290: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
72a0: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
72b0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
72c0: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
72d0: 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  s. The exception
72e0: 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65   is if the state
72f0: 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65  ment being parse
7300: 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a  d was passed.  *
7310: 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  * to an sqlite3_
7320: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63  declare_vtab() c
7330: 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73  all. In that cas
7340: 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  e only the colum
7350: 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64  n names.  ** and
7360: 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75   types will be u
7370: 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  sed, so there is
7380: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
7390: 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20   for namespace. 
73a0: 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a   ** collisions..
73b0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44    */.  if( !IN_D
73c0: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
73d0: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
73e0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
73f0: 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  e;.    if( SQLIT
7400: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
7410: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
7420: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
7430: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7440: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
7450: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
7460: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
7470: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
7480: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
7490: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
74a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
74b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
74c0: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
74d0: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
74e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
74f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
7500: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f  >init.busy || CO
7510: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
7520: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
7530: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
7540: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
7550: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  }.      goto beg
7560: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7570: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
7580: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
7590: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b, zName, zDb)!=
75a0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
75b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
75c0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
75d0: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
75e0: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
75f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7600: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7610: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
7620: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
7630: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
7640: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
7650: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
7660: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
7670: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50  iled = 1;.    pP
7680: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
7690: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
76a0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
76b0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
76c0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
76d0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
76e0: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
76f0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
7700: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
7710: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
7720: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
7730: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
7740: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7750: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
7760: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
7770: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 61  (1048576) );.  a
7780: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
7790: 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  NewTable==0 );. 
77a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
77b0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
77c0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
77d0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
77e0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
77f0: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
7800: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
7810: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
7820: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
7830: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
7840: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
7850: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
7860: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
7870: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
7880: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7890: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
78a0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
78b0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
78c0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
78d0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
78e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
78f0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
7900: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
7910: 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  ) );.    pTable-
7920: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
7930: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
7940: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
7950: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
7960: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7970: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
7980: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
7990: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
79a0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
79b0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
79c0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
79d0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
79e0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
79f0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
7a00: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
7a10: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
7a20: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
7a30: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
7a40: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
7a50: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
7a60: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
7a70: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
7a80: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
7a90: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
7aa0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
7ab0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
7ac0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
7ad0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7ae0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
7af0: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
7b00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
7b10: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
7b20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
7b30: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
7b40: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
7b50: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
7b60: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
7b70: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
7b80: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
7b90: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
7ba0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 0, iDb);..#if
7bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7bc0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
7bd0: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
7be0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7bf0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
7c00: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
7c10: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
7c20: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
7c30: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
7c40: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
7c50: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
7c60: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
7c70: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
7c80: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
7c90: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
7ca0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7cb0: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
7cc0: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
7cd0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
7ce0: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
7cf0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
7d00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7d10: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
7d20: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
7d30: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
7d40: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
7d50: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
7d60: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
7d70: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
7d80: 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f  f, reg3); VdbeCo
7d90: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66  verage(v);.    f
7da0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d  ileFormat = (db-
7db0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
7dc0: 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d  LegacyFileFmt)!=
7dd0: 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
7de0: 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45        1 : SQLITE
7df0: 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  _MAX_FILE_FORMAT
7e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7e10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
7e20: 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61  teger, fileForma
7e30: 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  t, reg3);.    sq
7e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7e50: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
7e60: 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45   iDb, BTREE_FILE
7e70: 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a  _FORMAT, reg3);.
7e80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7ea0: 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65  ger, ENC(db), re
7eb0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
7ec0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7ed0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
7ee0: 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f   BTREE_TEXT_ENCO
7ef0: 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20  DING, reg3);.   
7f00: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
7f10: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
7f20: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
7f30: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
7f40: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
7f50: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
7f60: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
7f70: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
7f80: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
7f90: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
7fa0: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
7fb0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
7fc0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
7fd0: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
7fe0: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
7ff0: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
8000: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
8010: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
8020: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
8030: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
8040: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
8050: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
8060: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
8070: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
8080: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
8090: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
80a0: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
80b0: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
80c0: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
80d0: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
80e0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
80f0: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
8100: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
8110: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8120: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
8130: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8140: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
8150: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
8160: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
8170: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8180: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
8190: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
81a0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
81b0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61  .    {.      pPa
81c0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d  rse->addrCrTab =
81d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
81e0: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
81f0: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
8200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8210: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
8220: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
8230: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8240: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
8250: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
8260: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8270: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
8280: 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20  l, 0, reg3);.   
8290: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
82a0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
82b0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
82c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
82d0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
82e0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
82f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8300: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
8310: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
8320: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
8330: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
8340: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
8350: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
8360: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
8370: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
8380: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8390: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
83a0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
83b0: 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  is macro is used
83c0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
83d0: 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73  strings in a cas
83e0: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61  e-insensitive ma
83f0: 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73  nner..** It is s
8400: 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
8410: 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  han calling sqli
8420: 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72  te3StrICmp() dir
8430: 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72  ectly, but.** pr
8440: 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f  oduces larger co
8450: 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  de..**.** WARNIN
8460: 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  G: This macro is
8470: 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20   not compatible 
8480: 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28  with the strcmp(
8490: 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20  ) family. It.** 
84a0: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
84b0: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  the two strings 
84c0: 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72  are equal, other
84d0: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
84e0: 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78  define STRICMP(x
84f0: 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55  , y) (\.sqlite3U
8500: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
8510: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78  signed char *)(x
8520: 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33  )]==   \.sqlite3
8530: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
8540: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
8550: 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c  y)]     \.&& sql
8560: 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b  ite3StrICmp((x)+
8570: 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f  1,(y)+1)==0 )../
8580: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
8590: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
85a0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
85b0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
85c0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
85d0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
85e0: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
85f0: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
8600: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
8610: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8620: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
8630: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
8640: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
8650: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
8660: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
8670: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8680: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
8690: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
86a0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
86b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
86c0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
86d0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
86e0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
86f0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
8700: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8710: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
8720: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8730: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
8740: 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  n;.#if SQLITE_MA
8750: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
8760: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
8770: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8780: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
8790: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
87a0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
87b0: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
87c0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
87d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
87e0: 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  dif.  z = sqlite
87f0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
8800: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
8810: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
8820: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8830: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8840: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
8850: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
8860: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8870: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8880: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
8890: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
88a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
88b0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
88c0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
88d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
88e0: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
88f0: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
8900: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
8910: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
8920: 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e  (db,p->aCol,(p->
8930: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
8940: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
8950: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
8960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8970: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
8980: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8990: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
89a0: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
89b0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
89c0: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
89d0: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
89e0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
89f0: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
8a00: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
8a10: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
8a20: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
8a30: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
8a40: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45  inity.  ** 'NONE
8a50: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
8a60: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
8a70: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
8a80: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
8a90: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
8aa0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
8ab0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
8ac0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
8ad0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
8ae0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
8af0: 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20    pCol->szEst = 
8b00: 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  1;.  p->nCol++;.
8b10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8b20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8b30: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
8b40: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
8b50: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
8b60: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8b70: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
8b80: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
8b90: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
8ba0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
8bb0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
8bc0: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
8bd0: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
8be0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
8bf0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8c00: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
8c10: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
8c20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
8c30: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
8c40: 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61  le *p;.  p = pPa
8c50: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8c60: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
8c70: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
8c80: 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43   return;.  p->aC
8c90: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f  ol[p->nCol-1].no
8ca0: 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72  tNull = (u8)onEr
8cb0: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  ror;.}../*.** Sc
8cc0: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
8cd0: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
8ce0: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
8cf0: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
8d00: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
8d10: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
8d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
8d30: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
8d40: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
8d50: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
8d60: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
8d70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
8d80: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
8d90: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
8da0: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
8db0: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
8dc0: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
8dd0: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
8de0: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
8df0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
8e00: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
8e10: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
8e20: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
8e30: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
8e40: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
8e50: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
8e60: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
8e70: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
8e80: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
8e90: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
8ea0: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
8ed0: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
8ee0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
8ef0: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
8f00: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
8f10: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
8f20: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8f30: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
8f40: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8f50: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
8f60: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8f70: 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52  E_AFF_NONE.** 'R
8f80: 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51  EAL'        | SQ
8f90: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
8fa0: 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c   'FLOA'        |
8fb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8fc0: 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20  .** 'DOUB'      
8fd0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
8fe0: 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  EAL.**.** If non
8ff0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
9000: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
9010: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
9020: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
9030: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
9040: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
9050: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
9060: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
9070: 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20  , u8 *pszEst){. 
9080: 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68   u32 h = 0;.  ch
9090: 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f  ar aff = SQLITE_
90a0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63  AFF_NUMERIC;.  c
90b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72  onst char *zChar
90c0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49 6e   = 0;..  if( zIn
90d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 66 66  ==0 ) return aff
90e0: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30  ;.  while( zIn[0
90f0: 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  ] ){.    h = (h<
9100: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
9110: 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29  erToLower[(*zIn)
9120: 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b  &0xff];.    zIn+
9130: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
9140: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
9150: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
9160: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
9170: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
9180: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9190: 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43  F_TEXT;.      zC
91a0: 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d  har = zIn;.    }
91b0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
91c0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
91d0: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
91e0: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
91f0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9200: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
9210: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9220: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
9230: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
9240: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
9250: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
9260: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
9270: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
9280: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
9290: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
92a0: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
92b0: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
92c0: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
92d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
92e0: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
92f0: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
9300: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9310: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
9320: 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20  if( zIn[0]=='(' 
9330: 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23  ) zChar = zIn;.#
9340: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9350: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
9360: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
9370: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
9380: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
9390: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
93a0: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
93b0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
93c0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
93d0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
93e0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
93f0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9400: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
9410: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
9420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
9430: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
9440: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9450: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9460: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9470: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
9480: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
9490: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
94a0: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
94b0: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
94c0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
94d0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
94e0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
94f0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
9500: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
9510: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
9520: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
9530: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
9540: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
9550: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9560: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
9570: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9580: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
9590: 20 70 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e   pszEst is not N
95a0: 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73  ULL, store an es
95b0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69  timate of the fi
95c0: 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20  eld size.  The. 
95d0: 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20   ** estimate is 
95e0: 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74  scaled so that t
95f0: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e  he size of an in
9600: 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a  teger is 1.  */.
9610: 20 20 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a    if( pszEst ){.
9620: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b      *pszEst = 1;
9630: 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69     /* default si
9640: 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62  ze is approx 4 b
9650: 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ytes */.    if( 
9660: 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e  aff<SQLITE_AFF_N
9670: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
9680: 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20  if( zChar ){.   
9690: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61       while( zCha
96a0: 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[0] ){.        
96b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64    if( sqlite3Isd
96c0: 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29  igit(zChar[0]) )
96d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
96e0: 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t v = 0;.       
96f0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49       sqlite3GetI
9700: 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b  nt32(zChar, &v);
9710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d  .            v =
9720: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20   v/4 + 1;.      
9730: 20 20 20 20 20 20 69 66 28 20 76 3e 32 35 35 20        if( v>255 
9740: 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20  ) v = 255;.     
9750: 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d         *pszEst =
9760: 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20   v; /* BLOB(k), 
9770: 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52  VARCHAR(k), CHAR
9780: 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29  (k) -> r=(k/4+1)
9790: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
97a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
97b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68   }.          zCh
97c0: 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ar++;.        }.
97d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
97e0: 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35       *pszEst = 5
97f0: 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58  ;   /* BLOB, TEX
9800: 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20  T, CLOB -> r=5  
9810: 28 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73  (approx 20 bytes
9820: 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )*/.      }.    
9830: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
9840: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ff;.}../*.** Thi
9850: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9860: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
9870: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
9880: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
9890: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
98a0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
98b0: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
98c0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
98d0: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
98e0: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
98f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
9900: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
9910: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
9920: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9930: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
9940: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
9950: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
9960: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
9970: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
9980: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
9990: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
99a0: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
99b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
99c0: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
99d0: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
99e0: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  / .void sqlite3A
99f0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
9a00: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
9a10: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62  n *pType){.  Tab
9a20: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
9a30: 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50  *pCol;..  p = pP
9a40: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9a50: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
9a60: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
9a70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
9a80: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
9a90: 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Col-1];.  assert
9aa0: 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30  ( pCol->zType==0
9ab0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
9ac0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
9ad0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43  e(pParse->db, pC
9ae0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43  ol->zType);.  pC
9af0: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
9b00: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
9b10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 79  (pParse->db, pTy
9b20: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66  pe);.  pCol->aff
9b30: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
9b40: 66 66 69 6e 69 74 79 54 79 70 65 28 70 43 6f 6c  ffinityType(pCol
9b50: 2d 3e 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e  ->zType, &pCol->
9b60: 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  szEst);.}../*.**
9b70: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
9b80: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
9b90: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
9ba0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
9bb0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
9bc0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
9bd0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9be0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
9bf0: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
9c00: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
9c10: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
9c20: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
9c30: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
9c40: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
9c50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9c60: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
9c70: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
9c80: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
9c90: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
9ca0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
9cb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9cc0: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
9cd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
9ce0: 72 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20  rSpan *pSpan){. 
9cf0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
9d00: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
9d10: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9d20: 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61  e->db;.  p = pPa
9d30: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9d40: 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
9d50: 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43    pCol = &(p->aC
9d60: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a  ol[p->nCol-1]);.
9d70: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
9d80: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9d90: 46 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e  Function(pSpan->
9da0: 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e  pExpr, db->init.
9db0: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73  busy) ){.      s
9dc0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9dd0: 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20  Parse, "default 
9de0: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
9df0: 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73  [%s] is not cons
9e00: 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20  tant",.         
9e10: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
9e20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e30: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78  /* A copy of pEx
9e40: 70 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  pr is used inste
9e50: 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ad of the origin
9e60: 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e  al, as pExpr con
9e70: 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74  tains.      ** t
9e80: 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74  okens that point
9e90: 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d   to volatile mem
9ea0: 6f 72 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20  ory. The 'span' 
9eb0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
9ec0: 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65  n.      ** is re
9ed0: 71 75 69 72 65 64 20 62 79 20 70 72 61 67 6d 61  quired by pragma
9ee0: 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20   table_info..   
9ef0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
9f00: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
9f10: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
9f20: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c        pCol->pDfl
9f30: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
9f40: 75 70 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45  up(db, pSpan->pE
9f50: 78 70 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44  xpr, EXPRDUP_RED
9f60: 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  UCE);.      sqli
9f70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
9f80: 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20  ol->zDflt);.    
9f90: 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20    pCol->zDflt = 
9fa0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
9fb0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
9fc0: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
a000: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
a010: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
a020: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
a030: 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45  te(db, pSpan->pE
a040: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  xpr);.}../*.** D
a050: 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49  esignate the PRI
a060: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65  MARY KEY for the
a070: 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69   table.  pList i
a080: 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  s a list of name
a090: 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  s .** of columns
a0a0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70   that form the p
a0b0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
a0c0: 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74  pList is NULL, t
a0d0: 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  hen the.** most 
a0e0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
a0f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62  olumn of the tab
a100: 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  le is the primar
a110: 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  y key..**.** A t
a120: 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74  able can have at
a130: 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72   most one primar
a140: 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74  y key.  If the t
a150: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
a160: 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65  .** a primary ke
a170: 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74  y (and this is t
a180: 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72  he second primar
a190: 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61  y key) then crea
a1a0: 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  te an.** error..
a1b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49  **.** If the PRI
a1c0: 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61  MARY KEY is on a
a1d0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77   single column w
a1e0: 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73  hose datatype is
a1f0: 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65   INTEGER,.** the
a200: 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f  n we will try to
a210: 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e   use that column
a220: 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20   as the rowid.  
a230: 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50  Set the Table.iP
a240: 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  Key.** field of 
a250: 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
a260: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20  construction to 
a270: 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  be the index of 
a280: 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
a290: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
a2a0: 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20  n.  Table.iPKey 
a2b0: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20  is set to -1 if 
a2c0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49  there is.** no I
a2d0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a2e0: 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  EY..**.** If the
a2f0: 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49   key is not an I
a300: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a310: 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  EY, then create 
a320: 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65  a unique.** inde
a330: 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20  x for the key.  
a340: 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61  No index is crea
a350: 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20  ted for INTEGER 
a360: 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f  PRIMARY KEYs..*/
a370: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
a380: 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61  PrimaryKey(.  Pa
a390: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
a3a0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
a3b0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
a3c0: 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73   *pList,  /* Lis
a3d0: 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73  t of field names
a3e0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
a3f0: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
a400: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
a410: 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75   do with a uniqu
a420: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
a430: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c  /.  int autoInc,
a440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
a450: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
a460: 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  NT keyword is pr
a470: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73  esent */.  int s
a480: 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20  ortOrder     /* 
a490: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72  SQLITE_SO_ASC or
a4a0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20   SQLITE_SO_DESC 
a4b0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
a4c0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
a4d0: 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  ewTable;.  char 
a4e0: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
a4f0: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
a500: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69    int nTerm;.  i
a510: 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e  f( pTab==0 || IN
a520: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
a530: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
a540: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
a550: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
a560: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29  _HasPrimaryKey )
a570: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
a580: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
a590: 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73       "table \"%s
a5a0: 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  \" has more than
a5b0: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
a5c0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
a5d0: 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72  .    goto primar
a5e0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a  y_key_exit;.  }.
a5f0: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
a600: 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72   |= TF_HasPrimar
a610: 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73  yKey;.  if( pLis
a620: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
a630: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
a640: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
a650: 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73  l[iCol].colFlags
a660: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d   |= COLFLAG_PRIM
a670: 4b 45 59 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  KEY;.    zType =
a680: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a690: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 6e 54 65  ].zType;.    nTe
a6a0: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
a6b0: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69  .    nTerm = pLi
a6c0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66  st->nExpr;.    f
a6d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
a6e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
a6f0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
a700: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
a710: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
a720: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
a730: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
a740: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a750: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
a760: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
a770: 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61  Col[iCol].colFla
a780: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
a790: 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20  IMKEY;.         
a7a0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
a7b0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
a7c0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
a7d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a7e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
a7f0: 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20  if( nTerm==1.   
a800: 26 26 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69  && zType && sqli
a810: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65  te3StrICmp(zType
a820: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a  , "INTEGER")==0.
a830: 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d     && sortOrder=
a840: 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 0a 20  =SQLITE_SO_ASC. 
a850: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
a860: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
a870: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
a880: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  (u8)onError;.   
a890: 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63   assert( autoInc
a8a0: 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d  ==0 || autoInc==
a8b0: 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  1 );.    pTab->t
a8c0: 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49  abFlags |= autoI
a8d0: 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d  nc*TF_Autoincrem
a8e0: 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ent;.    if( pLi
a8f0: 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b  st ) pParse->iPk
a900: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
a910: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
a920: 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  r;.  }else if( a
a930: 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65  utoInc ){.#ifnde
a940: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
a950: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
a960: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a970: 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43  pParse, "AUTOINC
a980: 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61  REMENT is only a
a990: 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20  llowed on an ". 
a9a0: 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50        "INTEGER P
a9b0: 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65  RIMARY KEY");.#e
a9c0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
a9d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a9e0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 49  se->pVdbe;.    I
a9f0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 69 66 28  ndex *p;.    if(
aa00: 20 76 20 29 20 70 50 61 72 73 65 2d 3e 61 64 64   v ) pParse->add
aa10: 72 53 6b 69 70 50 4b 20 3d 20 73 71 6c 69 74 65  rSkipPK = sqlite
aa20: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
aa30: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 70 20 3d  P_Noop);.    p =
aa40: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
aa50: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
aa60: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
aa70: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
aaa0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29   0);.    if( p )
aab0: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 64 78 54 79  {.      p->idxTy
aac0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58 54  pe = SQLITE_IDXT
aad0: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a  YPE_PRIMARYKEY;.
aae0: 20 20 20 20 20 20 69 66 28 20 76 20 29 20 73 71        if( v ) sq
aaf0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ab00: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  e(v, pParse->add
ab10: 72 53 6b 69 70 50 4b 29 3b 0a 20 20 20 20 7d 0a  rSkipPK);.    }.
ab20: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
ab30: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
ab40: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
ab50: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
ab60: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
ab70: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
ab80: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
ab90: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
aba0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
abb0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
abc0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
abd0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
abe0: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
abf0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ac00: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ac10: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
ac20: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
ac30: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
ac40: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
ac50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
ac60: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
ac70: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
ac80: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  Table;.  sqlite3
ac90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
aca0: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  b;.  if( pTab &&
acb0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
acc0: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33  B.   && !sqlite3
acd0: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
ace0: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74  db->aDb[db->init
acf0: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a  .iDb].pBt).  ){.
ad00: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
ad10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
ad20: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
ad30: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
ad40: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20  CheckExpr);.    
ad50: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  if( pParse->cons
ad60: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a  traintName.n ){.
ad70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ad80: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
ad90: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
ada0: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73  k, &pParse->cons
adb0: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a  traintName, 1);.
adc0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
add0: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
ade0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
adf0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63  Parse->db, pChec
ae00: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
ae10: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
ae20: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
ae30: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
ae40: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
ae50: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
ae60: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
ae70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ae80: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
ae90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
aea0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
aeb0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
aec0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
aed0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
aee0: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
aef0: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
af00: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
af10: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
af20: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
af30: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
af40: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
af50: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
af60: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
af70: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
af80: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
af90: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
afa0: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
afb0: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
afc0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
afd0: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
afe0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73  dex *pIdx;.    s
aff0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b000: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b010: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  l);.    p->aCol[
b020: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
b030: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
b040: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
b050: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
b060: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
b070: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
b080: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
b090: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
b0a0: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
b0b0: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
b0c0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
b0d0: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
b0e0: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
b0f0: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
b100: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
b110: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
b120: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
b130: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
b140: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
b150: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  nKeyCol==1 );.  
b160: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
b170: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
b180: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
b190: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
b1a0: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
b1b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
b1c0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
b1d0: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
b1e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
b1f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b200: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
b210: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
b220: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
b230: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
b240: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
b250: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
b260: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
b270: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
b280: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
b290: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
b2a0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
b2b0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
b2c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
b2d0: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
b2e0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
b2f0: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
b300: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
b310: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
b320: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
b330: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
b340: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
b350: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
b360: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
b370: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
b380: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
b390: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
b3a0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
b3b0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
b3c0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
b3d0: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
b3e0: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
b3f0: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
b400: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
b410: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
b420: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
b430: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
b440: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
b450: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
b460: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
b470: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
b480: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
b490: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
b4a0: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
b4b0: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
b4c0: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
b4d0: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
b4e0: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
b4f0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
b500: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
b510: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
b520: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
b530: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
b540: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
b550: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
b560: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
b570: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
b580: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b590: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
b5a0: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
b5b0: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
b5c0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
b5d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
b5e0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
b5f0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
b600: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
b610: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
b620: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
b630: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
b640: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
b650: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
b660: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65  ollSeq(pParse, e
b670: 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  nc, pColl, zName
b680: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
b690: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
b6a0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
b6b0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
b6c0: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
b6d0: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
b6e0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
b6f0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
b700: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
b710: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
b720: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
b730: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
b740: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
b750: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
b760: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
b770: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
b780: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
b790: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
b7a0: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
b7b0: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
b7c0: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
b7d0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
b7e0: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
b7f0: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
b800: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
b810: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
b820: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
b830: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
b840: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
b850: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
b860: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
b870: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
b880: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
b890: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
b8a0: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
b8b0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
b8c0: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
b8d0: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
b8e0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
b8f0: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
b900: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
b910: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
b920: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
b930: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
b940: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
b950: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
b960: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69  e enough..*/.voi
b970: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
b980: 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61  ookie(Parse *pPa
b990: 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
b9a0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
b9b0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
b9c0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se);.  sqlite3 *
b9d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b9e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
b9f0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
ba00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
ba10: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
ba20: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71   iDb, 0) );.  sq
ba30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ba40: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
ba50: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
ba60: 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
ba70: 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c  ie+1, r1);.  sql
ba80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ba90: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
baa0: 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d  iDb, BTREE_SCHEM
bab0: 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a  A_VERSION, r1);.
bac0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
bad0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
bae0: 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  r1);.}../*.** Me
baf0: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
bb00: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
bb10: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
bb20: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
bb30: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
bb40: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
bb50: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
bb60: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
bb70: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
bb80: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
bb90: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  or..**.** The es
bba0: 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72  timate is conser
bbb0: 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68  vative.  It migh
bbc0: 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74  t be larger that
bbd0: 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c   what is.** real
bbe0: 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ly needed..*/.st
bbf0: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
bc00: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
bc10: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
bc20: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
bc30: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
bc40: 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20  *z=='"' ){ n++; 
bc50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
bc60: 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 2;.}../*.** T
bc70: 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
bc80: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
bc90: 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66  to an output buf
bca0: 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  fer. The second 
bcb0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
bcc0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
bcd0: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f   integer that co
bce0: 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65  ntains the offse
bcf0: 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f  t at.** which to
bd00: 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20   write into the 
bd10: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54  output buffer. T
bd20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70  his function cop
bd30: 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74  ies the.** nul-t
bd40: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
bd50: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
bd60: 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74  he third paramet
bd70: 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  er, zSignedIdent
bd80: 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63  ,.** to the spec
bd90: 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20  ified offset in 
bda0: 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75  the buffer and u
bdb0: 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20  pdates *pIdx to 
bdc0: 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  refer.** to the 
bdd0: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
bde0: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77   the last byte w
bdf0: 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65  ritten before re
be00: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20  turning..** .** 
be10: 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53  If the string zS
be20: 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69  ignedIdent consi
be30: 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
be40: 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a  alpha-numeric.**
be50: 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65   characters, doe
be60: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
be70: 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20   a digit and is 
be80: 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f  not an SQL keywo
be90: 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  rd,.** then it i
bea0: 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20  s copied to the 
beb0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78  output buffer ex
bec0: 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20  actly as it is. 
bed0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74  Otherwise,.** it
bee0: 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67   is quoted using
bef0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a   double-quotes..
bf00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
bf10: 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c  dentPut(char *z,
bf20: 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72   int *pIdx, char
bf30: 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b   *zSignedIdent){
bf40: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
bf50: 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69   *zIdent = (unsi
bf60: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e  gned char*)zSign
bf70: 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69  edIdent;.  int i
bf80: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
bf90: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20    i = *pIdx;..  
bfa0: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
bfb0: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
bfc0: 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  ( !sqlite3Isalnu
bfd0: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
bfe0: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
bff0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
c000: 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65  edQuote = sqlite
c010: 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b  3Isdigit(zIdent[
c020: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
c030: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
c040: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
c050: 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20  !=TK_ID.        
c060: 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d      || zIdent[j]
c070: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
c080: 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20  || j==0;..  if( 
c090: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
c0a0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
c0b0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
c0c0: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
c0d0: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
c0e0: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
c0f0: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
c100: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
c110: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
c120: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
c130: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
c140: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
c150: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
c160: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
c170: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
c180: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
c190: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
c1a0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
c1b0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
c1c0: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
c1d0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
c1e0: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
c1f0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
c200: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
c210: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
c220: 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33  ableStmt(sqlite3
c230: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b   *db, Table *p){
c240: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
c250: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
c260: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
c270: 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f  ep2, *zEnd;.  Co
c280: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20  lumn *pCol;.  n 
c290: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20  = 0;.  for(pCol 
c2a0: 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  = p->aCol, i=0; 
c2b0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
c2c0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  pCol++){.    n +
c2d0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43  = identLength(pC
c2e0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a  ol->zName) + 5;.
c2f0: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
c300: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
c310: 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20  ;.  if( n<50 ){ 
c320: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
c330: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
c340: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
c350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
c360: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
c370: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
c380: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
c390: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
c3a0: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
c3b0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
c3c0: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
c3d0: 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d  );.  if( zStmt==
c3e0: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  0 ){.    db->mal
c3f0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
c400: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c410: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
c420: 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43  ntf(n, zStmt, "C
c430: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
c440: 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72    k = sqlite3Str
c450: 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20  len30(zStmt);.  
c460: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
c470: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
c480: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
c490: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
c4a0: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
c4b0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
c4c0: 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ++){.    static 
c4d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
c4e0: 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a  st azType[] = {.
c4f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
c500: 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f  E_AFF_NONE    */
c510: 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20   "",.        /* 
c520: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
c530: 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20     */ " TEXT",. 
c540: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c550: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20  _AFF_NUMERIC */ 
c560: 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20  " NUM",.        
c570: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  /* SQLITE_AFF_IN
c580: 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c  TEGER */ " INT",
c590: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
c5a0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a  TE_AFF_REAL    *
c5b0: 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b  / " REAL".    };
c5c0: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
c5d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
c5e0: 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ype;..    sqlite
c5f0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
c600: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
c610: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74  ;.    k += sqlit
c620: 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d  e3Strlen30(&zStm
c630: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
c640: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
c650: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
c660: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
c670: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
c680: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
c690: 5f 41 46 46 5f 4e 4f 4e 45 20 3e 3d 20 30 20 29  _AFF_NONE >= 0 )
c6a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
c6b0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
c6c0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 3c 20 41  ITE_AFF_NONE < A
c6d0: 72 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29  rraySize(azType)
c6e0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c6f0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c700: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
c710: 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
c720: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c730: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
c740: 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  XT );.    testca
c750: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
c760: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty==SQLITE_AFF_N
c770: 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65  UMERIC );.    te
c780: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c790: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c7a0: 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
c7b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
c7c0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
c7d0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20  TE_AFF_REAL );. 
c7e0: 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20     .    zType = 
c7f0: 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66  azType[pCol->aff
c800: 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41  inity - SQLITE_A
c810: 46 46 5f 4e 4f 4e 45 5d 3b 0a 20 20 20 20 6c 65  FF_NONE];.    le
c820: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
c830: 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
c840: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
c850: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c860: 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20  FF_NONE .       
c870: 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66       || pCol->af
c880: 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41  finity==sqlite3A
c890: 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70  ffinityType(zTyp
c8a0: 65 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d  e, 0) );.    mem
c8b0: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
c8c0: 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Type, len);.    
c8d0: 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73  k += len;.    as
c8e0: 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20  sert( k<=n );.  
c8f0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
c900: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
c910: 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29  [k], "%s", zEnd)
c920: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
c930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a  ;.}../*.** Resiz
c940: 65 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  e an Index objec
c950: 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75  t to hold N colu
c960: 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75  mns total.  Retu
c970: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
c980: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53  on success and S
c990: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61  QLITE_NOMEM on a
c9a0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a  n OOM error..*/.
c9b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a  static int resiz
c9c0: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c  eIndexObject(sql
c9d0: 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20  ite3 *db, Index 
c9e0: 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20  *pIdx, int N){. 
c9f0: 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20   char *zExtra;. 
ca00: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
ca10: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
ca20: 3d 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =N ) return SQLI
ca30: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
ca40: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
ca50: 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d  ==0 );.  nByte =
ca60: 20 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20   (sizeof(char*) 
ca70: 2b 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20  + sizeof(i16) + 
ca80: 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d  1)*N;.  zExtra =
ca90: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
caa0: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
cab0: 0a 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30  .  if( zExtra==0
cac0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
cad0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79  _NOMEM;.  memcpy
cae0: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
caf0: 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68  zColl, sizeof(ch
cb00: 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  ar*)*pIdx->nColu
cb10: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43  mn);.  pIdx->azC
cb20: 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 7a 45  oll = (char**)zE
cb30: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
cb40: 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  = sizeof(char*)*
cb50: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
cb60: 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ra, pIdx->aiColu
cb70: 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a  mn, sizeof(i16)*
cb80: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
cb90: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
cba0: 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b   = (i16*)zExtra;
cbb0: 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a  .  zExtra += siz
cbc0: 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65  eof(i16)*N;.  me
cbd0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
cbe0: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70  x->aSortOrder, p
cbf0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
cc00: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
cc10: 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b  r = (u8*)zExtra;
cc20: 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
cc30: 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73   = N;.  pIdx->is
cc40: 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72  Resized = 1;.  r
cc50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cc60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  .}../*.** Estima
cc70: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77  te the total row
cc80: 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61 62   width for a tab
cc90: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
cca0: 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65  id estimateTable
ccb0: 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61  Width(Table *pTa
ccc0: 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  b){.  unsigned w
ccd0: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e  Table = 0;.  con
cce0: 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43  st Column *pTabC
ccf0: 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  ol;.  int i;.  f
cd00: 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c  or(i=pTab->nCol,
cd10: 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61   pTabCol=pTab->a
cd20: 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  Col; i>0; i--, p
cd30: 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77  TabCol++){.    w
cd40: 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c  Table += pTabCol
cd50: 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69  ->szEst;.  }.  i
cd60: 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  f( pTab->iPKey<0
cd70: 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70   ) wTable++;.  p
cd80: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  Tab->szTabRow = 
cd90: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54  sqlite3LogEst(wT
cda0: 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  able*4);.}../*.*
cdb0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61  * Estimate the a
cdc0: 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61  verage size of a
cdd0: 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65   row for an inde
cde0: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
cdf0: 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57  d estimateIndexW
ce00: 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78  idth(Index *pIdx
ce10: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49  ){.  unsigned wI
ce20: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ndex = 0;.  int 
ce30: 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  i;.  const Colum
ce40: 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  n *aCol = pIdx->
ce50: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20  pTable->aCol;.  
ce60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
ce70: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
ce80: 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64 78      i16 x = pIdx
ce90: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
cea0: 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49 64     assert( x<pId
ceb0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  x->pTable->nCol 
cec0: 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d  );.    wIndex +=
ced0: 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b   x<0 ? 1 : aCol[
cee0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
cef0: 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  ]].szEst;.  }.  
cf00: 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d  pIdx->szIdxRow =
cf10: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
cf20: 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20  Index*4);.}../* 
cf30: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 76  Return true if v
cf40: 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20  alue x is found 
cf50: 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74  any of the first
cf60: 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66   nCol entries of
cf70: 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74   aiCol[].*/.stat
cf80: 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e  ic int hasColumn
cf90: 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f  (const i16 *aiCo
cfa0: 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74  l, int nCol, int
cfb0: 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43   x){.  while( nC
cfc0: 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78  ol-- > 0 ) if( x
cfd0: 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72  ==*(aiCol++) ) r
cfe0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
cff0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
d000: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
d010: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70 61  at the end of pa
d020: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
d030: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74  ABLE statement t
d040: 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49 54  hat.** has a WIT
d050: 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75 73  HOUT ROWID claus
d060: 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  e.  The job of t
d070: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
d080: 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a  o convert both.*
d090: 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  * internal schem
d0a0: 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  a data structure
d0b0: 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72 61  s and the genera
d0c0: 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73 6f  ted VDBE code so
d0d0: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61 72   that they.** ar
d0e0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  e appropriate fo
d0f0: 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
d100: 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  D table instead 
d110: 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65  of a rowid table
d120: 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 63  ..** Changes inc
d130: 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lude:.**.**     
d140: 28 31 29 20 20 43 6f 6e 76 65 72 74 20 74 68 65  (1)  Convert the
d150: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
d160: 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74  into an OP_Creat
d170: 65 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69  eIndex.  There i
d180: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 6f  s.**          no
d190: 20 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f 72   rowid btree for
d1a0: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
d1b0: 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  .  Instead, the 
d1c0: 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20  canonical.**    
d1d0: 20 20 20 20 20 20 64 61 74 61 20 73 74 6f 72 61        data stora
d1e0: 67 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  ge is a covering
d1f0: 20 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a   index btree..**
d200: 20 20 20 20 20 28 32 29 20 20 42 79 70 61 73 73       (2)  Bypass
d210: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
d220: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
d230: 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a  er table entry.*
d240: 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74  *          for t
d250: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  he PRIMARY KEY a
d260: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
d270: 79 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a  y index is now.*
d280: 2a 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74  *          ident
d290: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 71 6c  ified by the sql
d2a0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
d2b0: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
d2c0: 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20  ble itself..**  
d2d0: 20 20 20 28 33 29 20 20 53 65 74 20 74 68 65 20     (3)  Set the 
d2e0: 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68  Index.tnum of th
d2f0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e  e PRIMARY KEY In
d300: 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  dex object in th
d310: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63  e.**          sc
d320: 68 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74  hema to the root
d330: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  page from the ma
d340: 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  in table..**    
d350: 20 28 34 29 20 20 53 65 74 20 61 6c 6c 20 63 6f   (4)  Set all co
d360: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
d370: 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61 20  MARY KEY schema 
d380: 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f 54  object to be NOT
d390: 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 35   NULL..**     (5
d3a0: 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65  )  Add all table
d3b0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
d3c0: 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65  PRIMARY KEY Inde
d3d0: 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20  x object.**     
d3e0: 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68 65       so that the
d3f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
d400: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
d410: 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a  .  The surplus.*
d420: 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  *          colum
d430: 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b  ns are part of K
d440: 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 61  eyInfo.nXField a
d450: 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  nd are not used 
d460: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
d470: 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75  sorting or looku
d480: 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20  p or uniqueness 
d490: 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28  checks..**     (
d4a0: 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20  6)  Replace the 
d4b0: 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c  rowid tail on al
d4c0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
d4d0: 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45  generated UNIQUE
d4e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64  .**          ind
d4f0: 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52  ices with the PR
d500: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
d510: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
d520: 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f  d convertToWitho
d530: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72  utRowidTable(Par
d540: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
d550: 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
d560: 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78  x *pIdx;.  Index
d570: 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b   *pPk;.  int nPk
d580: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
d590: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
d5a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
d5b0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
d5c0: 64 62 65 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  dbe;..  /* Conve
d5d0: 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65  rt the OP_Create
d5e0: 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 74 68 61  Table opcode tha
d5f0: 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79  t would normally
d600: 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 2a 2a   create the.  **
d610: 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f 72 20 74   root-page for t
d620: 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 61 6e  he table into an
d630: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 20   OP_CreateIndex 
d640: 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 69 6e 64  opcode.  The ind
d650: 65 78 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  ex.  ** created 
d660: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
d670: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
d680: 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  x..  */.  if( pP
d690: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20  arse->addrCrTab 
d6a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  ){.    assert( v
d6b0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
d6c0: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 50 61 72  dbeGetOp(v, pPar
d6d0: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 29 2d 3e  se->addrCrTab)->
d6e0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 72 65 61  opcode = OP_Crea
d6f0: 74 65 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  teIndex;.  }..  
d700: 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72  /* Bypass the cr
d710: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52  eation of the PR
d720: 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20  IMARY KEY btree 
d730: 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  and the sqlite_m
d740: 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
d750: 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 69   entry..  */.  i
d760: 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53  f( pParse->addrS
d770: 6b 69 70 50 4b 20 29 7b 0a 20 20 20 20 61 73 73  kipPK ){.    ass
d780: 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71  ert( v );.    sq
d790: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
d7a0: 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b  , pParse->addrSk
d7b0: 69 70 50 4b 29 2d 3e 6f 70 63 6f 64 65 20 3d 20  ipPK)->opcode = 
d7c0: 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 0a 0a 20 20  OP_Goto;.  }..  
d7d0: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52  /* Locate the PR
d7e0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
d7f0: 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61    Or, if this ta
d800: 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ble was original
d810: 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47  ly.  ** an INTEG
d820: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74  ER PRIMARY KEY t
d830: 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e  able, create a n
d840: 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ew PRIMARY KEY i
d850: 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ndex. .  */.  if
d860: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
d870: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
d880: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69   *pList;.    pLi
d890: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
d8a0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
d8b0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  e, 0, 0);.    if
d8c0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
d8d0: 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  urn;.    pList->
d8e0: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[0].zName = sql
d8f0: 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
d900: 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
d940: 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
d950: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
d960: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61  .sortOrder = pPa
d970: 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65  rse->iPkSortOrde
d980: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
d990: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
d9a0: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 70 50  ==pTab );.    pP
d9b0: 6b 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  k = sqlite3Creat
d9c0: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
d9d0: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70  , 0, 0, pList, p
d9e0: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c  Tab->keyConf, 0,
d9f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
da00: 66 28 20 70 50 6b 3d 3d 30 20 29 20 72 65 74 75  f( pPk==0 ) retu
da10: 72 6e 3b 0a 20 20 20 20 70 50 6b 2d 3e 69 64 78  rn;.    pPk->idx
da20: 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 44  Type = SQLITE_ID
da30: 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
da40: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  ;.    pTab->iPKe
da50: 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  y = -1;.  }else{
da60: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
da70: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
da80: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 2f 2a 0a  x(pTab);.    /*.
da90: 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c      ** Remove al
daa0: 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  l redundant colu
dab0: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49  mns from the PRI
dac0: 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65  MARY KEY.  For e
dad0: 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20  xample, change. 
dae0: 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
daf0: 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63  EY(a,b,a,b,c,b,c
db00: 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22  ,d)" into just "
db10: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
db20: 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20  c,d)".  Later.  
db30: 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65    ** code assume
db40: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
db50: 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65  Y contains no re
db60: 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  peated columns..
db70: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
db80: 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65  =j=1; i<pPk->nKe
db90: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
dba0: 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
dbb0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
dbc0: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
dbd0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
dbe0: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20  Pk->nColumn--;. 
dbf0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dc00: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
dc10: 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69  n[j++] = pPk->ai
dc20: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
dc30: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b   }.    }.    pPk
dc40: 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20  ->nKeyCol = j;. 
dc50: 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65   }.  pPk->isCove
dc60: 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73 73 65  ring = 1;.  asse
dc70: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
dc80: 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
dc90: 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ol;..  /* Make s
dca0: 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e  ure every column
dcb0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
dcc0: 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 2e  KEY is NOT NULL.
dcd0: 20 20 28 45 78 63 65 70 74 2c 0a 20 20 2a 2a 20    (Except,.  ** 
dce0: 64 6f 20 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74  do not enforce t
dcf0: 68 69 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72  his for imposter
dd00: 20 74 61 62 6c 65 73 2e 29 20 2a 2f 0a 20 20 69   tables.) */.  i
dd10: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  f( !db->init.imp
dd20: 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20  osterTable ){.  
dd30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
dd40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 54  ; i++){.      pT
dd50: 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69  ab->aCol[pPk->ai
dd60: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75  Column[i]].notNu
dd70: 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ll = 1;.    }.  
dd80: 20 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75    pPk->uniqNotNu
dd90: 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ll = 1;.  }..  /
dda0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
ddb0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
ddc0: 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  EY is the table 
ddd0: 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70  root page */.  p
dde0: 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d  Pk->tnum = pTab-
ddf0: 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64  >tnum;..  /* Upd
de00: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
de10: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
de20: 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69   of all UNIQUE i
de30: 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72  ndices by conver
de40: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69  ting.  ** the fi
de50: 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  nal rowid column
de60: 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   into one or mor
de70: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
de80: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20   PRIMARY KEY..  
de90: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  */.  for(pIdx=pT
dea0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
deb0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
dec0: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  xt){.    int n;.
ded0: 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72      if( IsPrimar
dee0: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
def0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
df00: 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b  for(i=n=0; i<nPk
df10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
df20: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
df30: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
df40: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
df50: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20  >aiColumn[i]) ) 
df60: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n++;.    }.    i
df70: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
df80: 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
df90: 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20  s a superset of 
dfa0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
dfb0: 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e  */.      pIdx->n
dfc0: 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e  Column = pIdx->n
dfd0: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f  KeyCol;.      co
dfe0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
dff0: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
e000: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78  xObject(db, pIdx
e010: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  , pIdx->nKeyCol+
e020: 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
e030: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78   for(i=0, j=pIdx
e040: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b  ->nKeyCol; i<nPk
e050: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e060: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
e070: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
e080: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
e090: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
e0a0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
e0b0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b  iColumn[j] = pPk
e0c0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
e0d0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
e0e0: 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[j] = pPk->az
e0f0: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
e100: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e110: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e120: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  pIdx->nColumn>=p
e130: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29  Idx->nKeyCol+n )
e140: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
e150: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  dx->nColumn>=j )
e160: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
e170: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
e180: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
e190: 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a   KEY index.  */.
e1a0: 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e    if( nPk<pTab->
e1b0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  nCol ){.    if( 
e1c0: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
e1d0: 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d  t(db, pPk, pTab-
e1e0: 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b  >nCol) ) return;
e1f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
e200: 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  nPk; i<pTab->nCo
e210: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
e220: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50  f( !hasColumn(pP
e230: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  k->aiColumn, j, 
e240: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i) ){.        as
e250: 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f  sert( j<pPk->nCo
e260: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
e270: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
e280: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50   = i;.        pP
e290: 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22  k->azColl[j] = "
e2a0: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
e2b0: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e2c0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e2d0: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20  pPk->nColumn==j 
e2e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e2f0: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a  Tab->nCol==j );.
e300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
e310: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
e320: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->nCol;.  }.}../
e330: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e340: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
e350: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
e360: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
e370: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
e380: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
e390: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
e3a0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
e3b0: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
e3c0: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
e3d0: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
e3e0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
e3f0: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
e400: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
e410: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
e420: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
e430: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
e440: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
e450: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
e460: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
e470: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
e480: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
e490: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
e4a0: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
e4b0: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
e4c0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
e4d0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
e4e0: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
e4f0: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
e500: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
e510: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
e520: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
e530: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
e540: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
e550: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
e560: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
e570: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
e580: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
e590: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
e5a0: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
e5b0: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
e5c0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
e5d0: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
e5e0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
e5f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
e600: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
e610: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
e620: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
e630: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
e640: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
e650: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
e660: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
e670: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
e680: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
e690: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
e6a0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
e6b0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
e6c0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
e6d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e6e0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e6f0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
e700: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
e710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e720: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
e730: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
e740: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
e750: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
e760: 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62      /* The ')' b
e770: 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e  efore options in
e780: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
e790: 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74  E */.  u8 tabOpt
e7a0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
e7b0: 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70  * Extra table op
e7c0: 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30  tions. Usually 0
e7d0: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  . */.  Select *p
e7e0: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
e7f0: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
e800: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
e810: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
e820: 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20  able *p;        
e830: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e840: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
e850: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e860: 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
e870: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e880: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
e890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e8a0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
e8b0: 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c  n which the tabl
e8c0: 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64  e lives */.  Ind
e8d0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
e8e0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70         /* An imp
e8f0: 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68  lied index of th
e900: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66  e table */..  if
e910: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
e920: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 64 62 2d  elect==0) || db-
e930: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e940: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e950: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
e960: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
e970: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
e980: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
e990: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65  nit.busy || !pSe
e9a0: 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  lect );..  /* If
e9b0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
e9c0: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
e9d0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
e9e0: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
e9f0: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
ea00: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
ea10: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
ea20: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
ea30: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
ea40: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
ea50: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
ea60: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
ea70: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
ea80: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
ea90: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
eaa0: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
eab0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
eac0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
ead0: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
eae0: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
eaf0: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
eb00: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
eb10: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
eb20: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
eb30: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
eb40: 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69  Special processi
eb50: 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ng for WITHOUT R
eb60: 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20  OWID Tables */. 
eb70: 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54   if( tabOpts & T
eb80: 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29  F_WithoutRowid )
eb90: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  {.    if( (p->ta
eba0: 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
ebb0: 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20  increment) ){.  
ebc0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ebd0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
ebe0: 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45        "AUTOINCRE
ebf0: 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  MENT not allowed
ec00: 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49   on WITHOUT ROWI
ec10: 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  D tables");.    
ec20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
ec30: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
ec40: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
ec50: 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20  maryKey)==0 ){. 
ec60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ec70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52  rMsg(pParse, "PR
ec80: 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e  IMARY KEY missin
ec90: 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20  g on table %s", 
eca0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  p->zName);.    }
ecb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74  else{.      p->t
ecc0: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69  abFlags |= TF_Wi
ecd0: 74 68 6f 75 74 52 6f 77 69 64 3b 0a 20 20 20 20  thoutRowid;.    
ece0: 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f    convertToWitho
ecf0: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61  utRowidTable(pPa
ed00: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  rse, p);.    }. 
ed10: 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   }..  iDb = sqli
ed20: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
ed30: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
ed40: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
ed50: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f  E_OMIT_CHECK.  /
ed60: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
ed70: 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e  in all CHECK con
ed80: 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69  straint expressi
ed90: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
eda0: 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20  p->pCheck ){.   
edb0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
edc0: 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
edd0: 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65  rse, p, NC_IsChe
ede0: 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b  ck, 0, p->pCheck
edf0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
ee00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ee10: 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a  _OMIT_CHECK) */.
ee20: 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  .  /* Estimate t
ee30: 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73  he average row s
ee40: 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ize for the tabl
ee50: 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d  e and for all im
ee60: 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f  plied indices */
ee70: 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65  .  estimateTable
ee80: 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28  Width(p);.  for(
ee90: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
eea0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
eeb0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74  >pNext){.    est
eec0: 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
eed0: 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pIdx);.  }..  /*
eee0: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
eef0: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
ef00: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
ef10: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
ef20: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
ef30: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
ef40: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
ef50: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
ef60: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
ef70: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
ef80: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
ef90: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
efa0: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
efb0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
efc0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
efd0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
efe0: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
eff0: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
f000: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
f010: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
f020: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
f030: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
f040: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
f050: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
f060: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
f070: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
f080: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
f090: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
f0a0: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
f0b0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
f0c0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  se);.    if( NEV
f0d0: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
f0e0: 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n;..    sqlite3V
f0f0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f100: 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20  Close, 0);..    
f110: 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69  /* .    ** Initi
f120: 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20  alize zType for 
f130: 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20  the new view or 
f140: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
f150: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
f160: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
f170: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
f180: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
f190: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
f1a0: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
f1b0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f1c0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d  _OMIT_VIEW.    }
f1d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
f1e0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a   view */.      z
f1f0: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
f200: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
f210: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
f220: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
f230: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
f240: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
f250: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
f260: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
f270: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
f280: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
f290: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
f2a0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
f2b0: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
f2c0: 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74  ble is in regist
f2d0: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
f2e0: 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ot..    **.    *
f2f0: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
f300: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
f310: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
f320: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
f330: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
f340: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
f350: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
f360: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
f370: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
f380: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
f390: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f3a0: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
f3b0: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
f3c0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
f3d0: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
f3e0: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
f3f0: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
f400: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
f410: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
f420: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
f430: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
f440: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
f450: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
f460: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
f470: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
f480: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
f490: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
f4a0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
f4b0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
f4c0: 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  st;.      Table 
f4d0: 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20  *pSelTab;..     
f4e0: 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e   assert(pParse->
f4f0: 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nTab==1);.      
f500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f510: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
f520: 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65  e, 1, pParse->re
f530: 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  gRoot, iDb);.   
f540: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f550: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
f560: 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20  _P2ISREG);.     
f570: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
f580: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
f590: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
f5a0: 64 65 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  dest, SRT_Table,
f5b0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
f5c0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f5d0: 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
f5e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f5f0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f600: 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Close, 1);.     
f610: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
f620: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
f630: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
f640: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
f650: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
f660: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ct);.        if(
f670: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
f680: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  turn;.        as
f690: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
f6a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   );.        p->n
f6b0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
f6c0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Col;.        p->
f6d0: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
f6e0: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53  aCol;.        pS
f6f0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
f700: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
f710: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
f720: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
f730: 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
f740: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
f750: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75   }..    /* Compu
f760: 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
f770: 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
f780: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
f790: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
f7a0: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  ){.      zStmt =
f7b0: 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
f7c0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c  (db, p);.    }el
f7d0: 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  se{.      Token 
f7e0: 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73  *pEnd2 = tabOpts
f7f0: 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73   ? &pParse->sLas
f800: 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20  tToken : pEnd;. 
f810: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
f820: 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65  End2->z - pParse
f830: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
f840: 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32  .      if( pEnd2
f850: 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20  ->z[0]!=';' ) n 
f860: 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20  += pEnd2->n;.   
f870: 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
f880: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
f890: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
f8a0: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
f8b0: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
f8c0: 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20  ameToken.z.     
f8d0: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
f8e0: 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65  * A slot for the
f8f0: 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65   record has alre
f900: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
f910: 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a  ed in the .    *
f920: 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  * SQLITE_MASTER 
f930: 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20  table.  We just 
f940: 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  need to update t
f950: 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c  hat slot with al
f960: 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66  l.    ** the inf
f970: 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63  ormation we've c
f980: 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f  ollected..    */
f990: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
f9a0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
f9b0: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
f9c0: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
f9d0: 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
f9e0: 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
f9f0: 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25  =%Q, rootpage=#%
fa00: 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  d, sql=%Q ".    
fa10: 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
fa20: 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
fa30: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
fa40: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
fa50: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
fa60: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
fa70: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
fa80: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
fa90: 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
faa0: 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
fab0: 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
fac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
fad0: 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
fae0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
faf0: 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
fb00: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
fb10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
fb20: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
fb30: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
fb40: 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
fb50: 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
fb60: 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
fb70: 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
fb80: 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
fb90: 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
fba0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62  /.    if( p->tab
fbb0: 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
fbc0: 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
fbd0: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
fbe0: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
fbf0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
fc00: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
fc10: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
fc20: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
fc30: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d  chema->pSeqTab==
fc40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
fc50: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
fc60: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
fc70: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
fc80: 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
fc90: 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
fca0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e           pDb->zN
fcb0: 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
fcc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
fcd0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
fce0: 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
fcf0: 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
fd00: 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
fd10: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
fd20: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
fd30: 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
fd40: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
fd50: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
fd60: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e  tbl_name='%q' AN
fd70: 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  D type!='trigger
fd80: 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  '", p->zName));.
fd90: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74    }...  /* Add t
fda0: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
fdb0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
fdc0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
fdd0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
fde0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
fdf0: 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  sy ){.    Table 
fe00: 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d  *pOld;.    Schem
fe10: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e  a *pSchema = p->
fe20: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73  pSchema;.    ass
fe30: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
fe40: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
fe50: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
fe60: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
fe70: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
fe80: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
fe90: 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  ame, p);.    if(
fea0: 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
feb0: 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
fec0: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
fed0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
fee0: 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
fef0: 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d  ) */.      db->m
ff00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
ff10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
ff20: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
ff30: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
ff40: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
ff50: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
ff60: 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  anges;..#ifndef 
ff70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
ff80: 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21  RTABLE.    if( !
ff90: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
ffa0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ffb0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
ffc0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e  har *)pParse->sN
ffd0: 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  ameToken.z;.    
ffe0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20    int nName;.   
fff0: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c     assert( !pSel
10000 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20  ect && pCons && 
10010 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66  pEnd );.      if
10020 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b  ( pCons->z==0 ){
10030 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d  .        pCons =
10040 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20   pEnd;.      }. 
10050 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e       nName = (in
10060 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  t)((const char *
10070 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d  )pCons->z - zNam
10080 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  e);.      p->add
10090 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
100a0 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72   sqlite3Utf8Char
100b0 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Len(zName, nName
100c0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
100d0 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
100e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
100f0 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
10100 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
10110 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
10120 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
10130 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
10140 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  3CreateView(.  P
10150 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10160 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
10170 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
10180 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
10190 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
101a0 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
101b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
101c0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
101d0 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  1,     /* The to
101e0 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
101f0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
10200 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
10210 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54  pName2,     /* T
10220 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
10230 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
10240 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65  the view */.  Se
10250 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
10260 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
10270 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
10280 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
10290 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
102a0 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
102b0 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
102c0 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69  RARY view */.  i
102d0 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
102e0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
102f0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20  ror messages if 
10300 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69  VIEW already exi
10310 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
10320 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
10330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
10340 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
10350 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
10360 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
10370 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  ;.  int iDb;.  s
10380 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
10390 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
103a0 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29  pParse->nVar>0 )
103b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
103c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70  orMsg(pParse, "p
103d0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f  arameters are no
103e0 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65  t allowed in vie
103f0 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ws");.    sqlite
10400 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
10410 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
10420 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
10430 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
10440 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
10450 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
10460 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20  1, 0, noErr);.  
10470 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
10480 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
10490 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
104a0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
104b0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
104c0 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
104d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
104e0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
104f0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
10500 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
10510 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
10520 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
10530 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
10540 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
10550 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
10560 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
10570 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
10580 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
10590 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
105a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
105b0 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
105c0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
105d0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
105e0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
105f0 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
10600 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
10610 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
10620 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
10630 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
10640 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
10650 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
10660 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
10670 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
10680 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
10690 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
106a0 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
106b0 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
106c0 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
106d0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
106e0 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
106f0 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
10700 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
10710 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
10720 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
10730 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10740 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
10750 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  t);.  if( db->ma
10760 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
10770 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
10780 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
10790 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sy ){.    sqlite
107a0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
107b0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
107c0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
107d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
107e0 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
107f0 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
10800 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
10810 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
10820 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
10830 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
10840 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30   ALWAYS(sEnd.z[0
10850 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b  ]!=0) && sEnd.z[
10860 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
10870 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
10880 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
10890 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73  0;.  n = (int)(s
108a0 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
108b0 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  z);.  z = pBegin
108c0 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c  ->z;.  while( AL
108d0 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c  WAYS(n>0) && sql
108e0 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
108f0 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
10900 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
10910 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
10920 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
10930 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
10940 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
10950 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
10960 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
10970 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
10980 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c  se, 0, &sEnd, 0,
10990 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d   0);.  return;.}
109a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
109b0 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
109c0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
109d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
109e0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
109f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10a00 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
10a10 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
10a20 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
10a30 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
10a40 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
10a50 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
10a60 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
10a70 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
10a80 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
10a90 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
10aa0 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
10ab0 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
10ac0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
10ad0 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
10ae0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
10af0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
10b00 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
10b10 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
10b20 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
10b30 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
10b40 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
10b50 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
10b60 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
10b70 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
10b80 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
10b90 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
10ba0 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
10bb0 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
10bc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10bd0 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
10be0 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10c00 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
10c10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
10c20 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
10c30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
10c40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
10c50 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
10c60 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
10c70 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 71  c errors */.  sq
10c80 6c 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74  lite3_xauth xAut
10c90 68 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  h;       /* Save
10ca0 64 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20  d xAuth pointer 
10cb0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  */..  assert( pT
10cc0 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
10cd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10ce0 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
10cf0 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
10d00 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
10d10 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  Table) ){.    re
10d20 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10d30 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56  R;.  }.  if( IsV
10d40 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
10d50 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
10d60 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
10d70 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
10d80 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
10d90 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
10da0 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
10db0 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
10dc0 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
10dd0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
10de0 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
10df0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
10e00 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
10e10 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
10e20 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
10e30 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
10e40 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
10e50 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
10e60 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
10e70 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
10e80 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
10e90 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
10ea0 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
10eb0 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
10ec0 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
10ed0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
10ee0 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
10ef0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
10f00 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
10f10 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
10f20 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
10f30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
10f40 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61  lly, the error a
10f50 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67  bove is now caug
10f60 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
10f70 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e  hing this point.
10f80 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f  .  ** But the fo
10f90 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20  llowing test is 
10fa0 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20  still important 
10fb0 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20  as it does come 
10fc0 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  up.  ** in the f
10fd0 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a  ollowing:.  ** .
10fe0 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
10ff0 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61  TABLE main.ex1(a
11000 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
11010 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31  TE TEMP VIEW ex1
11020 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f   AS SELECT a FRO
11030 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20  M ex1;.  **     
11040 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
11050 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69  mp.ex1;.  */.  i
11060 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
11070 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11080 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11090 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
110a0 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
110b0 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
110c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
110d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
110e0 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b  able->nCol>=0 );
110f0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
11100 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
11110 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
11120 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
11130 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74   names..  ** Not
11140 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
11150 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
11160 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
11170 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
11180 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
11190 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73  in the results s
111a0 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61  et of the view a
111b0 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63  nd will assign c
111c0 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74  ursors.  ** to t
111d0 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
111e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
111f0 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77   But we do not w
11200 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65  ant these change
11210 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72  s.  ** to be per
11220 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20  manent.  So the 
11230 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64  computation is d
11240 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66  one on a copy of
11250 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a   the SELECT.  **
11260 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
11270 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
11280 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
11290 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
112a0 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c   );.  pSel = sql
112b0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
112c0 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
112d0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65  t, 0);.  if( pSe
112e0 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61 62  l ){.    u8 enab
112f0 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62  leLookaside = db
11300 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
11310 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50  bled;.    n = pP
11320 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
11330 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
11340 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
11350 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b  se, pSel->pSrc);
11360 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
11370 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e  l = -1;.    db->
11380 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
11390 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ed = 0;.#ifndef 
113a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
113b0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41  ORIZATION.    xA
113c0 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b  uth = db->xAuth;
113d0 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
113e0 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20   0;.    pSelTab 
113f0 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
11400 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
11410 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62  e, pSel);.    db
11420 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b  ->xAuth = xAuth;
11430 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54  .#else.    pSelT
11440 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
11450 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
11460 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e  arse, pSel);.#en
11470 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  dif.    db->look
11480 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d  aside.bEnabled =
11490 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65   enableLookaside
114a0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  ;.    pParse->nT
114b0 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  ab = n;.    if( 
114c0 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
114d0 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
114e0 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
114f0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
11500 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
11510 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
11520 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
11530 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
11540 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
11550 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
11560 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
11570 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
11580 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  b, pSelTab);.   
11590 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
115a0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
115b0 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d  d(db, 0, pTable-
115c0 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
115d0 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
115e0 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20  ma->schemaFlags 
115f0 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  |= DB_UnresetVie
11600 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ws;.    }else{. 
11610 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
11620 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72  l = 0;.      nEr
11630 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  r++;.    }.    s
11640 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
11650 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20  te(db, pSel);.  
11660 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
11670 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  r++;.  }.#endif 
11680 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
11690 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IEW */.  return 
116a0 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
116b0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
116c0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
116d0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
116e0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
116f0 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  BLE) */..#ifndef
11700 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11710 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
11720 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
11730 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
11740 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
11750 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
11760 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
11770 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
11780 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
11790 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74  lem *i;.  assert
117a0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
117b0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78  utexHeld(db, idx
117c0 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44  , 0) );.  if( !D
117d0 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
117e0 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
117f0 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
11800 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
11810 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
11820 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[idx].pSchema->
11830 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71  tblHash); i;i=sq
11840 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
11850 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
11860 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
11870 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
11880 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
11890 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
118a0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
118b0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70  , pTab);.      p
118c0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
118d0 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
118e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
118f0 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
11900 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
11910 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
11920 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
11930 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
11940 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
11950 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
11960 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
11970 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
11980 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
11990 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
119a0 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
119b0 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
119c0 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
119d0 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
119e0 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
119f0 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
11a00 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
11a10 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
11a20 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
11a30 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
11a40 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  o..**.** Ticket 
11a50 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62  #1728:  The symb
11a60 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73  ol table might s
11a70 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66  till contain inf
11a80 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74  ormation.** on t
11a90 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64  ables and/or ind
11aa0 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68  ices that are th
11ab0 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  e process of bei
11ac0 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49  ng deleted..** I
11ad0 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b  f you are unluck
11ae0 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  y, one of those 
11af0 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20  deleted indices 
11b00 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a  or tables might.
11b10 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ** have the same
11b20 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72   rootpage number
11b30 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62   as the real tab
11b40 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74  le or index that
11b50 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76   is.** being mov
11b60 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f  ed.  So we canno
11b70 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67  t stop searching
11b80 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
11b90 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75   match .** becau
11ba0 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  se the first mat
11bb0 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20  ch might be for 
11bc0 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74  one of the delet
11bd0 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72  ed indices.** or
11be0 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20   tables and not 
11bf0 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  the table/index 
11c00 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79  that is actually
11c10 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a   being moved..**
11c20 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75   We must continu
11c30 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  e looping until 
11c40 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
11c50 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72  ndices with.** r
11c60 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68  ootpage==iFrom h
11c70 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  ave been convert
11c80 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f  ed to have a roo
11c90 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20  tpage of iTo.** 
11ca0 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
11cb0 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67  ertain that we g
11cc0 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65  ot the right one
11cd0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
11ce0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
11cf0 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
11d00 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71  RootPageMoved(sq
11d10 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
11d20 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
11d30 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
11d40 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
11d50 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20  sh *pHash;.  Db 
11d60 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
11d70 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11d80 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
11d90 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26   0) );.  pDb = &
11da0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
11db0 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
11dc0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a  chema->tblHash;.
11dd0 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
11de0 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
11df0 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
11e00 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
11e10 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
11e20 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
11e30 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
11e40 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
11e50 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
11e60 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20       pTab->tnum 
11e70 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
11e80 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
11e90 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
11ea0 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
11eb0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
11ec0 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
11ed0 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
11ee0 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
11ef0 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
11f00 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
11f10 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
11f20 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
11f30 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
11f40 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
11f50 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
11f60 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74  .** Write code t
11f70 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c  o erase the tabl
11f80 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
11f90 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74   iTable from dat
11fa0 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c  abase iDb..** Al
11fb0 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f  so write code to
11fc0 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
11fd0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
11fe0 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
11ff0 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74  ema.** if a root
12000 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72  -page of another
12010 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
12020 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79  by the btree-lay
12030 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61  er whilst.** era
12040 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69  sing iTable (thi
12050 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
12060 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
12070 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a   database)..*/ .
12080 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
12090 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73  royRootPage(Pars
120a0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
120b0 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
120c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
120d0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
120e0 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20  se);.  int r1 = 
120f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
12100 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
12110 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12120 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
12130 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
12140 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
12150 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  t(pParse);.#ifnd
12160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12170 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
12180 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73  P_Destroy stores
12190 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72   an in integer r
121a0 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  1. If this integ
121b0 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
121c0 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
121d0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
121e0 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
121f0 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
12200 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
12210 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
12220 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
12230 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
12240 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
12250 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
12260 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e  ** The "#NNN" in
12270 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
12280 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
12290 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
122a0 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
122b0 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e   in register NNN
122c0 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72  .  See grammar r
122d0 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ules associated 
122e0 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49  with the TK_REGI
122f0 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20  STER.  ** token 
12300 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12310 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
12320 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
12330 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
12340 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
12350 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
12360 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
12370 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
12380 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
12390 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
123a0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
123b0 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  ), iTable, r1, r
123c0 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
123d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
123e0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
123f0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
12400 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
12410 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
12420 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
12430 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
12440 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
12450 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
12460 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
12470 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
12480 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
12490 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
124a0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
124b0 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
124c0 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
124d0 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
124e0 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
124f0 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
12500 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
12510 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
12520 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
12530 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
12540 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
12550 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
12560 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12570 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
12580 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
12590 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
125a0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
125b0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
125c0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
125d0 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
125e0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
125f0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
12600 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
12610 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
12620 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
12630 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
12640 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
12650 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
12660 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
12670 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
12680 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
12690 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
126a0 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
126b0 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
126c0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
126d0 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
126e0 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
126f0 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
12700 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
12710 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
12720 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
12730 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
12740 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
12750 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
12760 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
12770 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
12780 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
12790 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
127a0 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
127b0 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
127c0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
127d0 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
127e0 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
127f0 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
12800 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
12810 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
12820 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
12830 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
12840 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
12850 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
12860 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
12870 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
12880 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
12890 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
128a0 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
128b0 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
128c0 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
128d0 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
128e0 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
128f0 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
12900 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
12910 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
12920 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
12930 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
12940 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
12950 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
12960 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
12970 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
12980 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
12990 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
129a0 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
129b0 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
129c0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
129d0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
129e0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
129f0 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
12a00 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
12a10 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
12a20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
12a30 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
12a40 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
12a50 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
12a60 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
12a70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
12a80 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
12a90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12aa0 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
12ab0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
12ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12ad0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
12ae0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
12af0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
12b00 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
12b10 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
12b20 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
12b30 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20  db->nDb );.     
12b40 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
12b50 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
12b60 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
12b70 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
12b80 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
12b90 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12ba0 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  Remove entries f
12bb0 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
12bc0 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72  tatN tables (for
12bd0 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a   N in (1,2,3)).*
12be0 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49  * after a DROP I
12bf0 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42  NDEX or DROP TAB
12c00 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  LE command..*/.s
12c10 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
12c20 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
12c30 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
12c40 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
12c50 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
12c60 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12c80 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e  * The database n
12c90 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  umber */.  const
12ca0 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20   char *zType,   
12cb0 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74    /* "idx" or "t
12cc0 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  bl" */.  const c
12cd0 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
12ce0 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78  /* Name of index
12cf0 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a   or table */.){.
12d00 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
12d10 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
12d20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
12d30 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66  [iDb].zName;.  f
12d40 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b  or(i=1; i<=4; i+
12d50 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61  +){.    char zTa
12d60 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74  b[24];.    sqlit
12d70 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
12d80 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73  of(zTab),zTab,"s
12d90 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29  qlite_stat%d",i)
12da0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
12db0 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
12dc0 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62  e->db, zTab, zDb
12dd0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
12de0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
12df0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
12e00 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
12e10 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51  Q.%s WHERE %s=%Q
12e20 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61  ",.        zDbNa
12e30 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c  me, zTab, zType,
12e40 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a   zName.      );.
12e50 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12e60 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12e70 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
12e80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12e90 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50  3CodeDropTable(P
12ea0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
12eb0 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69  ble *pTab, int i
12ec0 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  Db, int isView){
12ed0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
12ee0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12ef0 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65  se->db;.  Trigge
12f00 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44  r *pTrigger;.  D
12f10 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
12f20 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73  b[iDb];..  v = s
12f30 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12f40 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
12f50 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
12f60 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
12f70 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
12f80 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
12f90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12fa0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
12fb0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
12fc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12fd0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
12fe0 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  egin);.  }.#endi
12ff0 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
13000 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
13010 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
13020 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
13030 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20  d. Code.  ** is 
13040 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
13050 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
13060 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
13070 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74  nd/or.  ** sqlit
13080 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
13090 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
130a0 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
130b0 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
130c0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
130d0 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
130e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
130f0 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
13100 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
13110 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72   || .        pTr
13120 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
13130 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
13140 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
13150 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
13160 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
13170 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  );.    pTrigger 
13180 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
13190 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
131a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
131b0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  INCREMENT.  /* R
131c0 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
131d0 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
131e0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
131f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
13200 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
13210 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
13220 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
13230 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
13240 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68  opped.  ** at th
13250 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
13260 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
13270 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
13280 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d   needs to.  ** m
13290 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
132a0 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
132b0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
132c0 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
132d0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  */.  if( pTab->t
132e0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
132f0 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
13300 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
13310 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
13320 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
13330 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
13340 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
13350 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
13360 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
13370 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
13380 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
13390 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
133a0 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
133b0 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
133c0 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
133d0 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
133e0 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
133f0 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
13400 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
13410 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
13420 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
13430 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
13440 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
13450 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
13460 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
13470 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
13480 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
13490 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
134a0 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
134b0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
134c0 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
134d0 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
134e0 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
134f0 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
13500 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
13510 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
13520 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
13530 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
13540 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
13550 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
13560 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
13570 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
13580 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
13590 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
135a0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
135b0 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
135c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
135d0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
135e0 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
135f0 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
13600 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
13610 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  nd modify.  ** t
13620 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
13630 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
13640 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
13650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13660 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
13670 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
13680 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
13690 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
136a0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
136b0 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
136c0 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
136d0 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
136e0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
136f0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
13700 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
13710 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
13720 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13730 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
13740 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
13750 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
13760 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
13770 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
13780 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
13790 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
137a0 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
137b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
137c0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
137d0 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
137e0 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
137f0 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
13800 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13810 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
13820 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
13830 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
13840 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13850 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
13860 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
13870 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
13880 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
13890 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f  c==1 );.  if( no
138a0 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
138b0 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20  ssErr++;.  pTab 
138c0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
138d0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
138e0 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
138f0 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
13900 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
13910 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
13920 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
13930 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
13940 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
13950 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
13960 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
13970 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
13980 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13990 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
139a0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
139b0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
139c0 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
139d0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
139e0 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
139f0 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
13a00 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
13a10 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
13a20 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
13a30 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
13a40 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
13a50 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
13a60 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
13a70 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
13a80 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
13a90 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13aa0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
13ab0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13ac0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13ad0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
13ae0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
13af0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
13b00 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
13b10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
13b20 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
13b30 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
13b40 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
13b50 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13b60 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13b70 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
13b80 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
13b90 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13ba0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
13bb0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
13bc0 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
13bd0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
13be0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
13bf0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
13c00 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
13c10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13c20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
13c30 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
13c40 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
13c50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
13c60 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
13c70 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
13c80 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
13c90 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
13ca0 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
13cb0 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
13cc0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
13cd0 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
13ce0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
13cf0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
13d00 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
13d10 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
13d20 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
13d30 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
13d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13d50 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
13d60 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
13d70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13d80 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
13d90 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
13da0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
13db0 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
13dc0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13dd0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
13de0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
13df0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13e00 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
13e10 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
13e20 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
13e30 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13e40 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
13e50 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
13e60 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
13e70 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
13e80 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
13e90 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
13ea0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
13eb0 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
13ec0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13ed0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13ee0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
13ef0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
13f00 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13f10 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13f20 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
13f30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13f40 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
13f50 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
13f60 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
13f70 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
13f80 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
13f90 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
13fa0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
13fb0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
13fc0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
13fd0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13fe0 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
13ff0 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
14000 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
14010 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14020 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14030 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
14040 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
14050 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
14060 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14070 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
14080 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
14090 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
140a0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
140b0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
140c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
140d0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
140e0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
140f0 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
14100 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
14110 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
14120 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14130 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14140 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
14150 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14160 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14170 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
14180 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
14190 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
141a0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
141b0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
141c0 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
141d0 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
141e0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
141f0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
14200 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
14210 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
14220 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
14230 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
14240 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
14250 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14260 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
14270 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
14280 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
14290 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
142a0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
142b0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
142c0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
142d0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
142e0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
142f0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
14300 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
14310 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
14320 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
14330 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
14340 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
14350 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
14360 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
14370 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
14380 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
14390 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
143a0 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
143b0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
143c0 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
143d0 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
143e0 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
143f0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
14400 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
14410 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
14420 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
14430 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
14440 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
14450 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
14460 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
14470 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
14480 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
14490 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
144a0 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
144b0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
144c0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
144d0 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
144e0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
144f0 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
14500 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
14510 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
14520 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
14530 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
14540 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
14550 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
14560 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
14570 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
14580 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14590 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
145a0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
145b0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
145c0 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
145d0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
145e0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
145f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
14600 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
14610 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
14620 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
14630 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
14640 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
14650 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
14660 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
14670 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
14680 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
14690 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
146a0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
146b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
146c0 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
146d0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
146e0 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
146f0 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
14700 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
14710 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
14720 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
14730 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
14740 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
14750 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
14760 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
14770 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
14780 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
14790 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
147a0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
147b0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
147c0 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
147d0 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
147e0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
147f0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
14800 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
14810 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14820 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
14830 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
14840 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
14850 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
14860 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
14870 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
14880 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
14890 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
148a0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
148b0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
148c0 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
148d0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
148e0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
148f0 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
14900 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14910 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
14920 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
14930 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
14940 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
14950 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
14960 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
14970 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
14980 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
14990 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
149a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
149b0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
149c0 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
149d0 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
149e0 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
149f0 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
14a00 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
14a10 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
14a20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
14a30 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
14a40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
14a50 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
14a60 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
14a70 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
14a80 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
14a90 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
14aa0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
14ab0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
14ac0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
14ad0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
14ae0 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
14af0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
14b00 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
14b10 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
14b20 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
14b30 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
14b40 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
14b50 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
14b60 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
14b70 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
14b80 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
14b90 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
14ba0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
14bb0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
14bc0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
14bd0 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
14be0 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
14bf0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
14c00 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
14c10 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
14c20 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
14c30 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
14c40 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
14c50 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
14c60 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
14c70 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
14c80 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
14c90 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
14ca0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
14cb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
14cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14cd0 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
14ce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
14cf0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
14d00 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
14d10 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
14d20 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
14d30 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
14d40 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
14d50 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
14d60 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
14d70 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
14d80 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
14d90 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
14da0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
14db0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
14dc0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
14dd0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
14de0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
14df0 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
14e00 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
14e10 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
14e20 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
14e30 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
14e40 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
14e50 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
14e60 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
14e70 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
14e80 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
14e90 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
14ea0 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
14eb0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
14ec0 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
14ed0 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
14ee0 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
14ef0 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
14f00 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
14f10 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
14f20 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
14f30 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
14f40 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
14f50 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
14f60 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
14f70 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
14f80 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76    pFKey->zTo, (v
14f90 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
14fa0 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
14fb0 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64 62 2d  pFKey ){.    db-
14fc0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
14fd0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  1;.    goto fk_e
14fe0 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  nd;.  }.  if( pN
14ff0 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73  extTo ){.    ass
15000 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50  ert( pNextTo->pP
15010 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  revTo==0 );.    
15020 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
15030 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e   pNextTo;.    pN
15040 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d  extTo->pPrevTo =
15050 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f   pFKey;.  }..  /
15060 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
15070 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
15080 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
15090 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
150a0 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
150b0 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
150c0 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  end:.  sqlite3Db
150d0 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b  Free(db, pFKey);
150e0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
150f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15100 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
15110 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
15120 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f  tDelete(db, pFro
15130 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
15140 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
15150 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  b, pToCol);.}../
15160 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15170 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
15180 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
15190 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
151a0 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
151b0 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
151c0 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
151d0 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
151e0 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
151f0 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
15200 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
15210 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
15220 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
15230 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
15240 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
15250 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
15260 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
15270 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
15280 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
15290 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
152a0 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
152b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
152c0 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
152d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
152e0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
152f0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
15300 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
15310 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
15320 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
15330 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
15340 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
15350 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
15360 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30  t( isDeferred==0
15370 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d   || isDeferred==
15380 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  1 ); /* EV: R-30
15390 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70  323-21917 */.  p
153a0 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
153b0 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65   = (u8)isDeferre
153c0 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
153d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
153e0 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
153f0 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
15400 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
15410 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
15420 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
15430 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
15440 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
15450 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
15460 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
15470 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
15480 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
15490 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
154a0 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
154b0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
154c0 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
154d0 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
154e0 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63  he register spec
154f0 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
15500 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
15510 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
15520 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
15530 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
15540 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
15550 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
15560 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
15570 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
15580 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
15590 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
155a0 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
155b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
155c0 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
155d0 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
155e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
155f0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
15600 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
15610 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
15620 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
15630 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
15640 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
15650 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
15660 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
15670 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
15680 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
15690 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
156a0 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
156b0 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
156c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
156d0 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
156e0 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
156f0 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
15700 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20  iSorter;        
15710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
15720 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f  rsor opened by O
15730 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e  penSorter (if in
15740 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61   use) */.  int a
15750 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
15760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
15770 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
15780 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
15790 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
157a0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
157b0 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f  ss to jump to fo
157c0 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  r next iteration
157d0 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
15800 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
15810 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65  int iPartIdxLabe
15820 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
15830 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c  * Jump to this l
15840 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72  abel to skip a r
15850 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ow */.  Vdbe *v;
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
15880 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
15890 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
158a0 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
158b0 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
158c0 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
158d0 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
158e0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15900 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
15910 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64  ng assembled ind
15920 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
15930 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
15940 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a  rse->db;      /*
15950 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
15960 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
15970 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
15980 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
15990 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
159a0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
159b0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
159c0 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
159d0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
159e0 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e  rse, SQLITE_REIN
159f0 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  DEX, pIndex->zNa
15a00 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d  me, 0,.      db-
15a10 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
15a20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
15a30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
15a40 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74  * Require a writ
15a50 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  e-lock on the ta
15a60 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  ble to perform t
15a70 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  his operation */
15a80 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
15a90 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
15aa0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20   pTab->tnum, 1, 
15ab0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
15ac0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
15ad0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
15ae0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
15af0 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
15b00 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e  age>=0 ){.    tn
15b10 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65  um = memRootPage
15b20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
15b30 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
15b40 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d  um;.  }.  pKey =
15b50 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
15b60 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
15b70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70  Index);..  /* Op
15b80 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75  en the sorter cu
15b90 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74  rsor if we are t
15ba0 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  o use one. */.  
15bb0 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65  iSorter = pParse
15bc0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
15bd0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15be0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
15bf0 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64  iSorter, 0, pInd
15c00 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68  ex->nKeyCol, (ch
15c10 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20  ar*).           
15c20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15c30 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29  KeyInfoRef(pKey)
15c40 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
15c50 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61    /* Open the ta
15c60 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ble. Loop throug
15c70 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  h all rows of th
15c80 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69  e table, inserti
15c90 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65  ng index.  ** re
15ca0 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73  cords into the s
15cb0 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69  orter. */.  sqli
15cc0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
15cd0 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
15ce0 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
15cf0 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
15d00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15d10 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
15d20 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  ab, 0); VdbeCove
15d30 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65  rage(v);.  regRe
15d40 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
15d50 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
15d60 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  ;..  sqlite3Gene
15d70 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
15d80 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c  rse,pIndex,iTab,
15d90 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61  regRecord,0,&iPa
15da0 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b  rtIdxLabel,0,0);
15db0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15dc0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
15dd0 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72  rInsert, iSorter
15de0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
15df0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61  sqlite3ResolvePa
15e00 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73  rtIdxLabel(pPars
15e10 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  e, iPartIdxLabel
15e20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15e30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
15e40 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
15e50 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15e60 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
15e70 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
15e80 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  r1);.  if( memRo
15e90 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74  otPage<0 ) sqlit
15ea0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15eb0 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
15ec0 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
15ed0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15ee0 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
15ef0 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
15f20 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
15f30 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15f40 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  5(v, OPFLAG_BULK
15f50 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67  CSR|((memRootPag
15f60 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49  e>=0)?OPFLAG_P2I
15f70 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64  SREG:0));..  add
15f80 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
15f90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
15fa0 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72  terSort, iSorter
15fb0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
15fc0 67 65 28 76 29 3b 0a 20 20 61 73 73 65 72 74 28  ge(v);.  assert(
15fd0 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
15fe0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
15ff0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
16000 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e    if( IsUniqueIn
16010 64 65 78 28 70 49 6e 64 65 78 29 20 26 26 20 70  dex(pIndex) && p
16020 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Key!=0 ){.    in
16030 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
16040 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16050 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65   + 3;.    sqlite
16060 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16070 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a  P_Goto, 0, j2);.
16080 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
16090 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
160a0 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
160b0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
160c0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70  v, OP_SorterComp
160d0 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32  are, iSorter, j2
160e0 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20  , regRecord,.   
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b        pIndex->nK
16110 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
16120 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
16130 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
16140 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f  aint(pParse, OE_
16150 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a  Abort, pIndex);.
16160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
16170 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
16180 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16190 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
161a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
161b0 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65  rterData, iSorte
161c0 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49  r, regRecord, iI
161d0 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
161e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c  beAddOp3(v, OP_L
161f0 61 73 74 2c 20 69 49 64 78 2c 20 30 2c 20 2d 31  ast, iIdx, 0, -1
16200 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16210 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
16220 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65  Insert, iIdx, re
16230 67 52 65 63 6f 72 64 2c 20 30 29 3b 0a 20 20 73  gRecord, 0);.  s
16240 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16250 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
16260 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
16270 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16280 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
16290 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
162a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
162b0 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
162c0 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20  Sorter, addr2); 
162d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
162e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
162f0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
16300 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
16310 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
16320 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c  se, iTab);.  sql
16330 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16340 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
16350 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16360 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
16370 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a  se, iSorter);.}.
16380 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
16390 68 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f  heap space to ho
163a0 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65  ld an Index obje
163b0 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c  ct with nCol col
163c0 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72  umns..**.** Incr
163d0 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  ease the allocat
163e0 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76  ion size to prov
163f0 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78  ide an extra nEx
16400 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  tra bytes.** of 
16410 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73  8-byte aligned s
16420 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49  pace after the I
16430 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20  ndex object and 
16440 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  return a.** poin
16450 74 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72  ter to this extr
16460 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78  a space in *ppEx
16470 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  tra..*/.Index *s
16480 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
16490 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c  dexObject(.  sql
164a0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
164b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
164c0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31  nnection */.  i1
164d0 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  6 nCol,         
164e0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
164f0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
16500 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
16510 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
16520 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16530 66 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61  f bytes of extra
16540 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20   space to alloc 
16550 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78  */.  char **ppEx
16560 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  tra       /* Poi
16570 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74  nter to the "ext
16580 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a  ra" space */.){.
16590 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20    Index *p;     
165a0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
165b0 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ted index object
165c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
165d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
165e0 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
165f0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20   Index object + 
16600 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79  arrays */..  nBy
16610 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
16620 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20  of(Index)) +    
16630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16640 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f  ex structure  */
16650 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44  .          ROUND
16660 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  8(sizeof(char*)*
16670 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20  nCol) +         
16680 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
16690 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
166a0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c   ROUND8(sizeof(L
166b0 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20  ogEst)*(nCol+1) 
166c0 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61  +     /* Index.a
166d0 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a  iRowLogEst   */.
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166f0 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f   sizeof(i16)*nCo
16700 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f  l +            /
16710 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
16720 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
16730 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38         sizeof(u8
16740 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20  )*nCol);        
16750 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
16760 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20  ortOrder */.  p 
16770 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
16780 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
16790 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
167a0 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a   p ){.    char *
167b0 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
167c0 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)+ROUND8(sizeo
167d0 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70  f(Index));.    p
167e0 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
167f0 2a 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20  **)pExtra;      
16800 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44   pExtra += ROUND
16810 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  8(sizeof(char*)*
16820 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69  nCol);.    p->ai
16830 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67  RowLogEst = (Log
16840 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78  Est*)pExtra; pEx
16850 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  tra += sizeof(Lo
16860 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a  gEst)*(nCol+1);.
16870 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20      p->aiColumn 
16880 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20  = (i16*)pExtra; 
16890 20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20        pExtra += 
168a0 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
168b0 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  ;.    p->aSortOr
168c0 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72  der = (u8*)pExtr
168d0 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d  a;.    p->nColum
168e0 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = nCol;.    p-
168f0 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20  >nKeyCol = nCol 
16900 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72  - 1;.    *ppExtr
16910 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b  a = ((char*)p) +
16920 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
16930 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
16940 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
16950 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
16960 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
16970 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
16980 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
16990 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
169a0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
169b0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
169c0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
169d0 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
169e0 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
169f0 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
16a00 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
16a10 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
16a20 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
16a30 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
16a40 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
16a50 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
16a60 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
16a70 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
16a80 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
16a90 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
16aa0 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
16ab0 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
16ac0 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
16ad0 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
16ae0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
16af0 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
16b00 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
16b10 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
16b20 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
16b30 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
16b40 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
16b50 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
16b60 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
16b70 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
16b80 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
16b90 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
16ba0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
16bb0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
16bc0 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
16bd0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72   successfully, r
16be0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
16bf0 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  to the new Index
16c00 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54  .** structure. T
16c10 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73  his is used by s
16c20 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
16c30 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68  Key() to mark th
16c40 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68  e index.** as th
16c50 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79  e tables primary
16c60 20 6b 65 79 20 28 49 6e 64 65 78 2e 69 64 78 54   key (Index.idxT
16c70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype==SQLITE_IDXT
16c80 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 0a  YPE_PRIMARYKEY).
16c90 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
16ca0 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
16cb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16cc0 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
16cd0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
16ce0 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
16cf0 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
16d00 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
16d10 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
16d20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
16d30 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
16d40 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
16d50 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
16d60 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
16d70 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
16d80 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
16d90 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
16da0 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
16db0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
16dc0 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
16dd0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
16de0 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
16df0 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
16e00 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
16e10 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
16e20 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
16e30 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
16e40 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
16e50 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
16e60 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73  at begins this s
16e70 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  tatement */.  Ex
16e80 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20  pr *pPIWhere,   
16e90 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
16ea0 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64   for partial ind
16eb0 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ices */.  int so
16ec0 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20  rtOrder,     /* 
16ed0 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72  Sort order of pr
16ee0 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70  imary key when p
16ef0 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20  List==NULL */.  
16f00 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20  int ifNotExist  
16f10 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72     /* Omit error
16f20 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64   if index alread
16f30 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
16f40 20 49 6e 64 65 78 20 2a 70 52 65 74 20 3d 20 30   Index *pRet = 0
16f50 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ;     /* Pointer
16f60 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
16f70 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
16f80 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
16f90 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
16fa0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
16fb0 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
16fc0 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
16fd0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
16fe0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
16ff0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
17000 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
17010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17020 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
17030 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
17040 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69  int i, j;.  DbFi
17050 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20  xer sFix;       
17060 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
17070 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
17080 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
17090 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  int sortOrderMas
170a0 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e  k;   /* 1 to hon
170b0 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78  or DESC in index
170c0 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20  .  0 to ignore. 
170d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
170e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
170f0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
17100 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
17110 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74  cific table cont
17120 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
17130 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
17140 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
17150 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17160 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
17170 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
17180 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
17190 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  *pName = 0;    /
171a0 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
171b0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
171c0 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73  to create */.  s
171d0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
171e0 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20  tem *pListItem; 
171f0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
17200 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 63  ver pList */.  c
17210 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  onst Column *pTa
17220 62 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  bCol;           
17230 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  /* A column in t
17240 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
17250 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20  t nExtra = 0;   
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17270 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
17280 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a  d for zExtra[] *
17290 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f  /.  int nExtraCo
172a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
172b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
172c0 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  f extra columns 
172d0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72  needed */.  char
172e0 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20   *zExtra = 0;   
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17300 45 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65  Extra space afte
17310 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  r the Index obje
17320 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ct */.  Index *p
17330 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  Pk = 0;      /* 
17340 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
17350 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  x for WITHOUT RO
17360 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20  WID tables */.. 
17370 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
17380 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c  ailed || IN_DECL
17390 41 52 45 5f 56 54 41 42 20 7c 7c 20 70 50 61 72  ARE_VTAB || pPar
173a0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
173b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
173c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
173d0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
173e0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
173f0 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
17400 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17410 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
17420 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
17430 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
17440 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
17450 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
17460 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
17470 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
17480 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
17490 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
174a0 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
174b0 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
174c0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
174d0 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
174e0 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
174f0 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
17500 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
17510 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
17520 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
17530 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
17540 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
17550 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
17560 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
17570 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
17580 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
17590 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
175a0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
175b0 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
175c0 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a  Name && pName->z
175d0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
175e0 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
175f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
17600 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
17610 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
17620 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  if the table.   
17630 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
17640 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
17650 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
17660 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69  1. Do not do thi
17670 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74  s.    ** if init
17680 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62  ialising a datab
17690 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
176a0 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  */.    if( !db->
176b0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
176c0 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
176d0 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
176e0 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
176f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
17700 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
17710 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
17720 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
17730 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
17740 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20   iDb = 1;.      
17750 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
17760 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e      sqlite3FixIn
17770 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
17780 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
17790 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
177a0 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
177b0 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
177c0 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42  e) ){.      /* B
177d0 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
177e0 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
177f0 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
17800 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
17810 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
17820 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
17830 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
17840 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
17850 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
17860 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
17870 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
17880 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  , &pTblName->a[0
17890 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
178a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
178b0 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29  ==0 || pTab==0 )
178c0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
178d0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
178e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
178f0 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62  if( iDb==1 && db
17900 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
17910 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma!=pTab->pSchem
17920 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
17930 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17940 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22  e, .           "
17950 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20  cannot create a 
17960 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f  TEMP index on no
17970 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25  n-TEMP table \"%
17980 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\"",.          
17990 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
179a0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
179b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
179c0 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52   }.    if( !HasR
179d0 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b  owid(pTab) ) pPk
179e0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
179f0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
17a00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
17a10 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
17a20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
17a30 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  tart==0 );.    p
17a40 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
17a50 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  ewTable;.    if(
17a60 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
17a70 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17a80 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
17a90 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
17aa0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
17ab0 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  a);.  }.  pDb = 
17ac0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
17ad0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
17ae0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17af0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
17b00 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
17b10 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
17b20 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
17b30 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  7)==0 .       &&
17b40 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
17b50 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  0.#if SQLITE_USE
17b60 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
17b70 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
17b80 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
17b90 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a  pTab->zName)==0.
17ba0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26  #endif.       &&
17bb0 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
17bc0 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d  (&pTab->zName[7]
17bd0 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21  ,"altertab_",9)!
17be0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
17bf0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17c00 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
17c10 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
17c20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
17c30 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17c40 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
17c50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17c60 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
17c70 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
17c80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17c90 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
17ca0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
17cb0 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
17cc0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17cd0 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
17ce0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17cf0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
17d00 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
17d10 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
17d20 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17d30 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
17d40 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
17d50 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
17d60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17d70 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
17d80 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
17d90 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
17da0 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
17db0 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
17dc0 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
17dd0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
17de0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
17df0 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
17e00 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
17e10 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
17e20 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
17e30 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
17e40 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
17e50 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
17e60 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
17e70 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
17e80 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
17e90 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
17ea0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
17eb0 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
17ec0 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
17ed0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17ee0 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
17ef0 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
17f00 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
17f10 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
17f20 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
17f30 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
17f40 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
17f50 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
17f60 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
17f70 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
17f80 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
17f90 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
17fa0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
17fb0 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
17fc0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
17fd0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
17fe0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  e);.    if( zNam
17ff0 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
18000 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18010 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
18020 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ->z!=0 );.    if
18030 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
18040 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
18050 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
18060 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
18070 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18080 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
18090 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
180a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
180b0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
180c0 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
180d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
180e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
180f0 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
18100 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
18110 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
18120 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
18130 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18140 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18150 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
18160 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
18170 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30  , pDb->zName)!=0
18180 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
18190 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
181a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
181b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
181c0 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
181d0 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
181e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
181f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
18200 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
18210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
18220 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
18230 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
18240 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
18250 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18260 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
18270 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
18280 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
18290 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
182a0 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
182b0 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
182c0 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
182d0 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  }.    zName = sq
182e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
182f0 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
18300 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d  ex_%s_%d", pTab-
18310 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
18320 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
18330 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18340 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18350 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
18360 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
18370 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
18380 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
18390 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
183a0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
183b0 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
183c0 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
183d0 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
183e0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
183f0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
18400 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
18410 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62  BLE(iDb), 0, zDb
18420 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
18430 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18440 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
18450 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
18460 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f  NDEX;.    if( !O
18470 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
18480 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54  b==1 ) i = SQLIT
18490 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
184a0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
184b0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
184c0 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
184d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
184e0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
184f0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18500 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
18510 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
18520 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
18530 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
18540 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
18550 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
18560 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
18570 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
18580 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
18590 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
185a0 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
185b0 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
185c0 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
185d0 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
185e0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
185f0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
18600 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
18610 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  , 0);.    if( pL
18620 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
18630 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18640 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
18650 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
18660 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
18670 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
186a0 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
186b0 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol-1].zName);.  
186c0 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
186d0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f  rtOrder = (u8)so
186e0 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
186f0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
18700 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
18710 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
18720 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
18730 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
18740 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
18750 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
18760 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
18770 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
18780 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
18790 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
187a0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
187b0 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
187c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
187d0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
187e0 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  );.      nExtra 
187f0 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53  += (1 + sqlite3S
18800 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
18810 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d  .zToken));.    }
18820 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
18830 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
18840 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
18850 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73    */.  nName = s
18860 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
18870 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43  Name);.  nExtraC
18880 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e  ol = pPk ? pPk->
18890 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70  nKeyCol : 1;.  p
188a0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41  Index = sqlite3A
188b0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
188c0 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45  ct(db, pList->nE
188d0 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c  xpr + nExtraCol,
188e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18900 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e         nName + n
18910 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74  Extra + 1, &zExt
18920 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ra);.  if( db->m
18930 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
18940 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18950 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
18960 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
18970 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
18980 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  ndex->aiRowLogEs
18990 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
189a0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
189b0 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43  MENT(pIndex->azC
189c0 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78  oll) );.  pIndex
189d0 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61  ->zName = zExtra
189e0 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e  ;.  zExtra += nN
189f0 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70  ame + 1;.  memcp
18a00 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
18a10 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
18a20 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
18a30 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
18a40 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28  dex->onError = (
18a50 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49  u8)onError;.  pI
18a60 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
18a70 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  l = onError!=OE_
18a80 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  None;.  pIndex->
18a90 69 64 78 54 79 70 65 20 3d 20 70 4e 61 6d 65 20  idxType = pName 
18aa0 3f 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  ? SQLITE_IDXTYPE
18ab0 5f 41 50 50 44 45 46 20 3a 20 53 51 4c 49 54 45  _APPDEF : SQLITE
18ac0 5f 49 44 58 54 59 50 45 5f 55 4e 49 51 55 45 3b  _IDXTYPE_UNIQUE;
18ad0 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
18ae0 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
18af0 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e  ].pSchema;.  pIn
18b00 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70  dex->nKeyCol = p
18b10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
18b20 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20  f( pPIWhere ){. 
18b30 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
18b40 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
18b50 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
18b60 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72  PartIdx, pPIWher
18b70 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65  e, 0);.    pInde
18b80 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
18b90 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20   = pPIWhere;.   
18ba0 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20   pPIWhere = 0;. 
18bb0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
18bc0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
18bd0 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
18be0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
18bf0 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
18c00 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
18c10 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
18c20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
18c30 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
18c40 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
18c50 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
18c60 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
18c70 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
18c80 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
18c90 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
18ca0 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
18cb0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61  */.  }..  /* Sca
18cc0 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
18cd0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
18ce0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
18cf0 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
18d00 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
18d10 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
18d20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
18d30 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
18d40 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
18d50 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
18d60 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  d..  **.  ** TOD
18d70 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74  O:  Add a test t
18d80 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
18d90 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
18da0 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20   is not named.  
18db0 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
18dc0 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  e within the sam
18dd0 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  e index.  Only t
18de0 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
18df0 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e of.  ** the co
18e00 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62  lumn will ever b
18e10 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70  e used by the op
18e20 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74  timizer.  Note t
18e30 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hat using the.  
18e40 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d  ** same column m
18e50 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61  ore than once ca
18e60 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72  nnot be an error
18e70 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
18e80 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20  uld .  ** break 
18e90 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
18ea0 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65  ibility - it nee
18eb0 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69  ds to be a warni
18ec0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ng..  */.  for(i
18ed0 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
18ee0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
18ef0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
18f00 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
18f10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
18f20 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
18f30 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  >zName;.    int 
18f40 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
18f50 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  er;.    char *zC
18f60 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
18f70 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
18f80 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
18f90 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  e */..    for(j=
18fa0 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  0, pTabCol=pTab-
18fb0 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
18fc0 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f  Col; j++, pTabCo
18fd0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
18fe0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
18ff0 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c  ColName, pTabCol
19000 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
19010 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
19020 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
19030 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19040 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19050 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
19060 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
19070 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
19080 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61  b->zName, zColNa
19090 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  me);.      pPars
190a0 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
190b0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
190c0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
190d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
190e0 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b  rt( j<=0x7fff );
190f0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
19100 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29  olumn[i] = (i16)
19110 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  j;.    if( pList
19120 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20  Item->pExpr ){. 
19130 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a       int nColl;.
19140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
19150 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
19160 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
19170 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
19180 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
19190 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
191a0 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
191b0 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
191c0 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
191d0 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
191e0 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
191f0 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
19200 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
19210 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
19220 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
19230 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
19240 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
19250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
19260 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
19270 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
19280 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43   if( !zColl ) zC
19290 6f 6c 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  oll = "BINARY";.
192a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
192b0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
192c0 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
192d0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
192e0 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  oll) ){.      go
192f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19300 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
19310 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
19320 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72  ] = zColl;.    r
19330 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
19340 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73  r = pListItem->s
19350 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f  ortOrder & sortO
19360 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49  rderMask;.    pI
19370 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
19380 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73  [i] = (u8)reques
19390 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
193a0 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
193b0 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
193c0 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
193d0 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Null = 0;.  }.  
193e0 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66  if( pPk ){.    f
193f0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e  or(j=0; j<pPk->n
19400 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
19410 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d      int x = pPk-
19420 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
19430 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
19440 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  n(pIndex->aiColu
19450 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  mn, pIndex->nKey
19460 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20  Col, x) ){.     
19470 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75     pIndex->nColu
19480 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c  mn--; .      }el
19490 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  se{.        pInd
194a0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
194b0 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  = x;.        pIn
194c0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
194d0 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b   pPk->azColl[j];
194e0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
194f0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
19500 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72   pPk->aSortOrder
19510 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  [j];.        i++
19520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19530 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
19540 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
19550 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19560 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
19570 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 49 6e  i] = -1;.    pIn
19580 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
19590 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 20   "BINARY";.  }. 
195a0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
195b0 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20  owEst(pIndex);. 
195c0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
195d0 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69  wTable==0 ) esti
195e0 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70  mateIndexWidth(p
195f0 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70  Index);..  if( p
19600 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
19610 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
19620 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
19630 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
19640 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
19650 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
19660 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
19670 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
19680 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
19690 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
196a0 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
196b0 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
196c0 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
196d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
196e0 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
196f0 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
19700 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
19710 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
19720 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
19730 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
19740 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
19750 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
19760 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
19770 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
19780 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
19790 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
197a0 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
197b0 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
197c0 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
197d0 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
197e0 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
197f0 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
19800 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
19810 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
19820 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
19830 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
19840 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
19850 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
19860 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52  Two UNIQUE or PR
19870 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
19880 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64  aints are consid
19890 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a  ered equivalent.
198a0 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73      ** (and thus
198b0 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65   suppressing the
198c0 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65   second one) eve
198d0 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64  n if they have d
198e0 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20  ifferent.    ** 
198f0 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20  sort orders..   
19900 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
19910 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
19920 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
19930 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20  ences or if the 
19940 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a  columns of.    *
19950 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  * the constraint
19960 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72   occur in differ
19970 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e  ent orders, then
19980 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
19990 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73   are.    ** cons
199a0 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
199b0 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20  and both result 
199c0 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  in separate indi
199d0 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
199e0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
199f0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
19a00 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
19a10 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
19a20 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
19a30 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
19a40 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
19a50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19a60 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d   pIdx->idxType!=
19a70 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
19a80 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61  PPDEF );.      a
19a90 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49  ssert( IsUniqueI
19aa0 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a  ndex(pIndex) );.
19ab0 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
19ac0 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78  >nKeyCol!=pIndex
19ad0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
19ae0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
19af0 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65  k=0; k<pIdx->nKe
19b00 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  yCol; k++){.    
19b10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19b20 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
19b30 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
19b40 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
19b50 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
19b60 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
19b70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19b80 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
19b90 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32  l[k];.        z2
19ba0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
19bb0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
19bc0 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69  ( z1!=z2 && sqli
19bd0 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
19be0 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
19bf0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
19c00 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
19c10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
19c20 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
19c30 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
19c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
19c50 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
19c60 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
19c70 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
19c80 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
19c90 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
19ca0 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
19cb0 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
19cc0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
19cd0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
19ce0 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
19cf0 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
19d00 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
19d10 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
19d20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
19d30 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
19d40 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
19d50 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
19d60 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
19d70 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
19d80 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
19d90 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
19da0 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
19db0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
19dc0 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
19dd0 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  vior for the ind
19de0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
19df0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
19e00 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
19e10 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
19e20 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
19e30 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
19e40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19e50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19e60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
19e70 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
19e80 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
19e90 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
19ea0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
19eb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
19ec0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
19ed0 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
19ee0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
19ef0 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
19f00 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
19f10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
19f20 20 20 20 20 20 20 70 52 65 74 20 3d 20 70 49 64        pRet = pId
19f30 78 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  x;.        goto 
19f40 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19f50 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
19f60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
19f70 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
19f80 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
19f90 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
19fa0 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
19fb0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
19fc0 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
19fd0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
19fe0 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
19ff0 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
1a000 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1a010 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
1a020 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20  Index->pSchema) 
1a030 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
1a040 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49  e3HashInsert(&pI
1a050 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  ndex->pSchema->i
1a060 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a080 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
1a090 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  , pIndex);.    i
1a0a0 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
1a0b0 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
1a0c0 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
1a0d0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1a0e0 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  /.      db->mall
1a0f0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
1a100 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a110 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a120 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
1a130 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
1a140 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
1a150 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1a160 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
1a170 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
1a180 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
1a190 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1a1a0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52  s the initial CR
1a1b0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1a1c0 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20  ment (or CREATE 
1a1d0 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a  TABLE if the.  *
1a1e0 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d  * index is an im
1a1f0 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20  plied index for 
1a200 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  a UNIQUE or PRIM
1a210 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1a220 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d  nt) then.  ** em
1a230 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63  it code to alloc
1a240 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f  ate the index ro
1a250 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61  otpage on disk a
1a260 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79  nd make an entry
1a270 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e   for.  ** the in
1a280 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74  dex in the sqlit
1a290 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
1a2a0 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  nd populate the 
1a2b0 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20  index with.  ** 
1a2c0 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64  content.  But, d
1a2d0 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66  o not do this if
1a2e0 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72   we are simply r
1a2f0 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
1a300 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
1a310 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68 65  ble to parse the
1a320 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74   schema, or if t
1a330 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65  his index is the
1a340 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
1a350 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54  ex.  ** of a WIT
1a360 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1a370 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1a380 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
1a390 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
1a3a0 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
1a3b0 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52  n implied PRIMAR
1a3c0 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e  Y KEY.  ** or UN
1a3d0 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20  IQUE index in a 
1a3e0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1a3f0 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
1a400 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
1a410 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
1a420 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
1a430 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
1a440 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
1a450 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
1a460 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
1a470 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
1a480 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1a490 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
1a4a0 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d  b) || pTblName!=
1a4b0 30 29 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  0) ){.    Vdbe *
1a4c0 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
1a4d0 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
1a4e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a4f0 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  m;..    v = sqli
1a500 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1a510 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
1a520 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1a530 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20  ate_index;...   
1a540 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
1a550 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
1a560 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
1a570 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1a580 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1a590 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
1a5a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a5b0 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  p2(v, OP_CreateI
1a5c0 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29  ndex, iDb, iMem)
1a5d0 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72  ;..    /* Gather
1a5e0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
1a5f0 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
1a600 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1a610 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65   into.    ** the
1a620 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
1a630 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1a640 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
1a650 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61  nt n = (int)(pPa
1a660 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1a670 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20  z - pName->z) + 
1a680 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
1a690 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  en.n;.      if( 
1a6a0 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27  pName->z[n-1]=='
1a6b0 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20  ;' ) n--;.      
1a6c0 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78  /* A named index
1a6d0 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69   with an explici
1a6e0 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  t CREATE INDEX s
1a6f0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
1a700 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
1a710 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52  3MPrintf(db, "CR
1a720 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a  EATE%s INDEX %.*
1a730 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72  s",.        onEr
1a740 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22  ror==OE_None ? "
1a750 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e  " : " UNIQUE", n
1a760 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20  , pName->z);.   
1a770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1a780 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   An automatic in
1a790 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61  dex created by a
1a7a0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
1a7b0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
1a7c0 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53  t */.      /* zS
1a7d0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1a7e0 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20  intf(""); */.   
1a7f0 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20     zStmt = 0;.  
1a800 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
1a810 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69  an entry in sqli
1a820 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68  te_master for th
1a830 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  is index.    */.
1a840 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1a850 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
1a860 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
1a870 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45  INTO %Q.%s VALUE
1a880 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c  S('index',%Q,%Q,
1a890 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20  #%d,%Q);",.     
1a8a0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1a8b0 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
1a8c0 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
1a8d0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
1a8e0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
1a8f0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d  Name,.        iM
1a900 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d  em,.        zStm
1a910 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
1a920 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1a930 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  Stmt);..    /* F
1a940 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69  ill the index wi
1a950 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61  th data and repa
1a960 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20  rse the schema. 
1a970 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72  Code an OP_Expir
1a980 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61  e.    ** to inva
1a990 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63  lidate all pre-c
1a9a0 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
1a9b0 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
1a9c0 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
1a9d0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
1a9e0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1a9f0 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
1aa00 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
1aa10 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1aa20 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
1aa30 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
1aa40 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
1aa50 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
1aa60 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
1aa70 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
1aa80 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65  ='index'", pInde
1aa90 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
1aaa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1aab0 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op1(v, OP_Expire
1aac0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
1aad0 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
1aae0 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
1aaf0 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
1ab00 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
1ab10 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
1ab20 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
1ab30 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
1ab40 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
1ab50 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
1ab60 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
1ab70 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
1ab80 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e   the correct con
1ab90 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20  straint check.  
1aba0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69  ** processing (i
1abb0 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74  n sqlite3Generat
1abc0 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b  eConstraintCheck
1abd0 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a  s()) as part of.
1abe0 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20    ** UPDATE and 
1abf0 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
1ac00 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  s.  .  */.  if( 
1ac10 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
1ac20 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
1ac30 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
1ac40 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
1ac50 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
1ac60 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
1ac70 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
1ac80 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
1ac90 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1aca0 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
1acb0 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
1acc0 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1acd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ace0 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
1acf0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1ad00 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
1ad10 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
1ad20 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
1ad30 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1ad40 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
1ad50 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
1ad60 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1ad70 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1ad80 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
1ad90 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
1ada0 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
1adb0 20 20 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70    }.    pRet = p
1adc0 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65  Index;.    pInde
1add0 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
1ade0 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
1adf0 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
1ae00 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
1ae10 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 66 72   if( pIndex ) fr
1ae20 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
1ae30 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ex);.  sqlite3Ex
1ae40 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49  prDelete(db, pPI
1ae50 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
1ae60 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1ae70 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
1ae80 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1ae90 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
1aea0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1aeb0 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
1aec0 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
1aed0 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49  /*.** Fill the I
1aee0 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20  ndex.aiRowEst[] 
1aef0 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75  array with defau
1af00 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  lt information -
1af10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1af20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
1af30 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20  we have not run 
1af40 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
1af50 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77  and..**.** aiRow
1af60 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73  Est[0] is suppos
1af70 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
1af80 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
1af90 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
1afa0 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
1afb0 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
1afc0 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
1afd0 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
1afe0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
1aff0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
1b000 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
1b010 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
1b020 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
1b030 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
1b040 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1b050 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
1b060 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1b070 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
1b080 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
1b090 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1b0a0 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ar combination o
1b0b0 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f  f the first 2 co
1b0c0 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
1b0d0 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66  index.  And so f
1b0e0 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61  orth.  It must a
1b0f0 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73  lways be the cas
1b100 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20  e that.*.**     
1b110 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
1b120 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d  ]<=aiRowEst[N-1]
1b130 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
1b140 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a  RowEst[N]>=1.**.
1b150 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  ** Apart from th
1b160 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74  at, we have litt
1b170 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69  le to go on besi
1b180 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73  des intuition as
1b190 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77   to.** how aiRow
1b1a0 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  Est[] should be 
1b1b0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
1b1c0 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61  e numbers genera
1b1d0 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20  ted here.** are 
1b1e0 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c  based on typical
1b1f0 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e   values found in
1b200 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e   actual indices.
1b210 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b220 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e  DefaultRowEst(In
1b230 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a  dex *pIdx){.  /*
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b250 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20  10,  9,  8,  7, 
1b260 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61   6 */.  LogEst a
1b270 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32  Val[] = { 33, 32
1b280 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a  , 30, 28, 26 };.
1b290 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49    LogEst *a = pI
1b2a0 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b  dx->aiRowLogEst;
1b2b0 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d  .  int nCopy = M
1b2c0 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56 61  IN(ArraySize(aVa
1b2d0 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  l), pIdx->nKeyCo
1b2e0 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  l);.  int i;..  
1b2f0 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74  /* Set the first
1b300 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f   entry (number o
1b310 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  f rows in the in
1b320 64 65 78 29 20 74 6f 20 74 68 65 20 65 73 74 69  dex) to the esti
1b330 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62  mated .  ** numb
1b340 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1b350 65 20 74 61 62 6c 65 2e 20 4f 72 20 31 30 2c 20  e table. Or 10, 
1b360 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  if the estimated
1b370 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1b380 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  .  ** in the tab
1b390 6c 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  le is less than 
1b3a0 74 68 61 74 2e 20 20 2a 2f 0a 20 20 61 5b 30 5d  that.  */.  a[0]
1b3b0 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1b3c0 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69  >nRowLogEst;.  i
1b3d0 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30  f( a[0]<33 ) a[0
1b3e0 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20 20 61  ] = 33;        a
1b3f0 73 73 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74  ssert( 33==sqlit
1b400 65 33 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a  e3LogEst(10) );.
1b410 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  .  /* Estimate t
1b420 68 61 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20  hat a[1] is 10, 
1b430 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20  a[2] is 9, a[3] 
1b440 69 73 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c  is 8, a[4] is 7,
1b450 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20   a[5] is.  ** 6 
1b460 61 6e 64 20 65 61 63 68 20 73 75 62 73 65 71 75  and each subsequ
1b470 65 6e 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e  ent value (if an
1b480 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d  y) is 5.  */.  m
1b490 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61  emcpy(&a[1], aVa
1b4a0 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28  l, nCopy*sizeof(
1b4b0 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28  LogEst));.  for(
1b4c0 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49  i=nCopy+1; i<=pI
1b4d0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  dx->nKeyCol; i++
1b4e0 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33  ){.    a[i] = 23
1b4f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b500 20 20 20 20 20 61 73 73 65 72 74 28 20 32 33 3d       assert( 23=
1b510 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35  =sqlite3LogEst(5
1b520 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ) );.  }..  asse
1b530 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  rt( 0==sqlite3Lo
1b540 67 45 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28  gEst(1) );.  if(
1b550 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1b560 49 64 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e  Idx) ) a[pIdx->n
1b570 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a  KeyCol] = 0;.}..
1b580 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1b590 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20  ne will drop an 
1b5a0 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69  existing named i
1b5b0 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74  ndex.  This rout
1b5c0 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ine.** implement
1b5d0 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58  s the DROP INDEX
1b5e0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
1b5f0 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49  oid sqlite3DropI
1b600 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
1b610 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
1b620 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73  me, int ifExists
1b630 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
1b640 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ex;.  Vdbe *v;. 
1b650 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1b660 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
1b670 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28   iDb;..  assert(
1b680 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
1b690 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63   );   /* Never c
1b6a0 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72  alled with prior
1b6b0 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28   errors */.  if(
1b6c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1b6d0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
1b6e0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1b6f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
1b700 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
1b710 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1b720 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
1b730 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
1b740 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1b750 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
1b760 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
1b770 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
1b780 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
1b790 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
1b7a0 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
1b7b0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ex==0 ){.    if(
1b7c0 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20   !ifExists ){.  
1b7d0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1b7e0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1b7f0 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
1b800 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
1b810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1b820 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
1b830 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
1b840 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
1b850 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a  atabase);.    }.
1b860 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
1b870 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
1b880 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1b890 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
1b8a0 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65   pIndex->idxType
1b8b0 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  !=SQLITE_IDXTYPE
1b8c0 5f 41 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73  _APPDEF ){.    s
1b8d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b8e0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
1b8f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
1b900 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
1b910 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1b920 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
1b930 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
1b940 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1b950 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1b960 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1b970 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
1b980 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
1b990 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b9a0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1b9b0 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
1b9c0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1b9d0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
1b9e0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
1b9f0 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
1ba00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
1ba10 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1ba20 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
1ba30 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
1ba40 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
1ba50 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1ba60 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1ba70 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
1ba80 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
1ba90 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1baa0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
1bab0 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
1bac0 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
1bad0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
1bae0 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
1baf0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1bb00 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1bb10 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
1bb20 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
1bb30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
1bb40 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1bb50 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
1bb60 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
1bb70 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
1bb80 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
1bb90 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
1bba0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
1bbb0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1bbc0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1bbd0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1bbe0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1bbf0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
1bc00 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1bc10 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
1bc20 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
1bc30 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
1bc40 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20  ERE name=%Q AND 
1bc50 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20  type='index'",. 
1bc60 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
1bc70 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
1bc80 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e  _TABLE(iDb), pIn
1bc90 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
1bca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65  ;.    sqlite3Cle
1bcb0 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
1bcc0 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c  rse, iDb, "idx",
1bcd0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b   pIndex->zName);
1bce0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
1bcf0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1bd00 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
1bd10 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
1bd20 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
1bd30 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1bd40 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1bd50 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
1bd60 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d  b, 0, 0, pIndex-
1bd70 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
1bd80 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
1bd90 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
1bda0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
1bdb0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
1bdc0 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
1bdd0 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
1bde0 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f   objects. Each o
1bdf0 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
1be00 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
1be10 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1be20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1be30 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  s sqlite3DbReall
1be40 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e  oc().** to exten
1be50 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74  d the array so t
1be60 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61  hat there is spa
1be70 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a  ce for a new obj
1be80 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  ect at the end..
1be90 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1bea0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1beb0 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e  ed, *pnEntry con
1bec0 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e  tains the curren
1bed0 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  t size of.** the
1bee0 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69   array (in entri
1bef0 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f  es - so the allo
1bf00 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45  cation is ((*pnE
1bf10 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29  ntry) * szEntry)
1bf20 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74   bytes.** in tot
1bf30 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
1bf40 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73  e realloc() is s
1bf50 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20  uccessful (i.e. 
1bf60 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74  if no OOM condit
1bf70 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65  ion occurs), the
1bf80 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  .** space alloca
1bf90 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ted for the new 
1bfa0 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64  object is zeroed
1bfb0 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74  , *pnEntry updat
1bfc0 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74  ed to.** reflect
1bfd0 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66   the new size of
1bfe0 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61   the array and a
1bff0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1c000 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  new allocation.*
1c010 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64  * returned. *pId
1c020 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1c030 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77  index of the new
1c040 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20   array entry in 
1c050 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1c060 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1c070 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69  he realloc() fai
1c080 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74  ls, *pIdx is set
1c090 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79   to -1, *pnEntry
1c0a0 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68   remains.** unch
1c0b0 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79  anged and a copy
1c0c0 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72   of pArray retur
1c0d0 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
1c0e0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1c0f0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
1c100 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
1c110 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1c120 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1c130 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
1c140 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
1c150 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
1c160 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
1c170 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
1c180 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
1c190 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
1c1a0 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
1c1b0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72  */.  int *pnEntr
1c1c0 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  y,     /* Number
1c1d0 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72   of objects curr
1c1e0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a  ently in use */.
1c1f0 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20    int *pIdx     
1c200 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1c210 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20   index of a new 
1c220 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  slot here */.){.
1c230 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
1c240 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20   n = *pnEntry;. 
1c250 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29   if( (n & (n-1))
1c260 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ==0 ){.    int s
1c270 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a  z = (n==0) ? 1 :
1c280 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a   2*n;.    void *
1c290 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
1c2a0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
1c2b0 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b  ay, sz*szEntry);
1c2c0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1c2d0 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   ){.      *pIdx 
1c2e0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
1c2f0 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d  rn pArray;.    }
1c300 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e  .    pArray = pN
1c310 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63  ew;.  }.  z = (c
1c320 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d  har*)pArray;.  m
1c330 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45  emset(&z[n * szE
1c340 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72  ntry], 0, szEntr
1c350 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b  y);.  *pIdx = n;
1c360 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20  .  ++*pnEntry;. 
1c370 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
1c380 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1c390 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1c3a0 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
1c3b0 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
1c3c0 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
1c3d0 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
1c3e0 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
1c3f0 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
1c400 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
1c410 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
1c420 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
1c430 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
1c440 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
1c450 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
1c460 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1c470 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1c480 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1c490 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1c4a0 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
1c4b0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1c4c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1c4d0 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
1c4e0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1c4f0 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
1c500 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
1c510 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
1c520 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c  a[0]),.      &pL
1c530 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20  ist->nId,.      
1c540 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c  &i.  );.  if( i<
1c550 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1c560 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1c570 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
1c580 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
1c590 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1c5a0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1c5b0 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e  Token(db, pToken
1c5c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
1c5d0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
1c5e0 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
1c5f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c  .void sqlite3IdL
1c600 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
1c610 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
1c620 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1c630 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1c640 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
1c650 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
1c660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1c670 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
1c680 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
1c690 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1c6a0 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
1c6b0 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
1c6c0 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
1c6d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1c6e0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c   the index in pL
1c6f0 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ist of the ident
1c700 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e  ifier named zId.
1c710 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
1c720 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
1c730 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73  int sqlite3IdLis
1c740 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70  tIndex(IdList *p
1c750 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  List, const char
1c760 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
1c770 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1c780 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1c790 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1c7a0 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1c7b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1c7c0 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
1c7d0 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
1c7e0 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1c7f0 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1c800 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74  ../*.** Expand t
1c810 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
1c820 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ed for the given
1c830 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20   SrcList object 
1c840 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e  by.** creating n
1c850 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20  Extra new slots 
1c860 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74  beginning at iSt
1c870 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20  art.  iStart is 
1c880 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e  zero based..** N
1c890 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72  ew slots are zer
1c8a0 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  oed..**.** For e
1c8b0 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20  xample, suppose 
1c8c0 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61  a SrcList initia
1c8d0 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f  lly contains two
1c8e0 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a   entries: A,B..*
1c8f0 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65  * To append 3 ne
1c900 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74  w entries onto t
1c910 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a  he end, do this:
1c920 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  .**.**    sqlite
1c930 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1c940 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c  db, pSrclist, 3,
1c950 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72   2);.**.** After
1c960 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20   the call above 
1c970 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  it would contain
1c980 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69  :  A, B, nil, ni
1c990 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68  l, nil..** If th
1c9a0 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e  e iStart argumen
1c9b0 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73  t had been 1 ins
1c9c0 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20  tead of 2, then 
1c9d0 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f  the result.** wo
1c9e0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20  uld have been:  
1c9f0 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  A, nil, nil, nil
1ca00 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64  , B.  To prepend
1ca10 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a   the new slots,.
1ca20 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61  ** the iStart va
1ca30 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20  lue would be 0. 
1ca40 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e   The result then
1ca50 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69   would.** be: ni
1ca60 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20  l, nil, nil, A, 
1ca70 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  B..**.** If a me
1ca80 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1ca90 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73  fails the SrcLis
1caa0 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  t is unchanged. 
1cab0 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c   The.** db->mall
1cac0 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69  ocFailed flag wi
1cad0 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75  ll be set to tru
1cae0 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
1caf0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1cb00 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20  arge(.  sqlite3 
1cb10 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  *db,       /* Da
1cb20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1cb30 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f  n to notify of O
1cb40 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53  OM errors */.  S
1cb50 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
1cb60 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74    /* The SrcList
1cb70 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20   to be enlarged 
1cb80 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
1cb90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cba0 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74  r of new slots t
1cbb0 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61  o add to pSrc->a
1cbc0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  [] */.  int iSta
1cbd0 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt         /* In
1cbe0 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d  dex in pSrc->a[]
1cbf0 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c   of first new sl
1cc00 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ot */.){.  int i
1cc10 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
1cc20 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69  hecking on calli
1cc30 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
1cc40 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1cc50 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
1cc60 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20  ( nExtra>=1 );. 
1cc70 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
1cc80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1cc90 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63  tart<=pSrc->nSrc
1cca0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
1ccb0 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70  te additional sp
1ccc0 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ace if needed */
1ccd0 0a 20 20 69 66 28 20 28 75 33 32 29 70 53 72 63  .  if( (u32)pSrc
1cce0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53  ->nSrc+nExtra>pS
1ccf0 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  rc->nAlloc ){.  
1cd00 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
1cd10 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  .    int nAlloc 
1cd20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  = pSrc->nSrc+nEx
1cd30 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f  tra;.    int nGo
1cd40 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  t;.    pNew = sq
1cd50 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
1cd60 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  b, pSrc,.       
1cd70 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
1cd80 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d  pSrc) + (nAlloc-
1cd90 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  1)*sizeof(pSrc->
1cda0 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
1cdb0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1cdc0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
1cdd0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1cde0 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b      return pSrc;
1cdf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
1ce00 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74  = pNew;.    nGot
1ce10 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c   = (sqlite3DbMal
1ce20 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
1ce30 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63  ) - sizeof(*pSrc
1ce40 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  ))/sizeof(pSrc->
1ce50 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72  a[0])+1;.    pSr
1ce60 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74  c->nAlloc = nGot
1ce70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
1ce80 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20   existing slots 
1ce90 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
1cea0 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74  the newly insert
1ceb0 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75  ed slots.  ** ou
1cec0 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a  t of the way */.
1ced0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1cee0 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b  rc-1; i>=iStart;
1cef0 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d   i--){.    pSrc-
1cf00 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70  >a[i+nExtra] = p
1cf10 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  Src->a[i];.  }. 
1cf20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e   pSrc->nSrc += n
1cf30 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72  Extra;..  /* Zer
1cf40 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  o the newly allo
1cf50 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20  cated slots */. 
1cf60 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61   memset(&pSrc->a
1cf70 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  [iStart], 0, siz
1cf80 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a  eof(pSrc->a[0])*
1cf90 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69  nExtra);.  for(i
1cfa0 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72  =iStart; i<iStar
1cfb0 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a  t+nExtra; i++){.
1cfc0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69      pSrc->a[i].i
1cfd0 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
1cfe0 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
1cff0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
1d000 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20  nlarged SrcList 
1d010 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63  */.  return pSrc
1d020 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ;.}.../*.** Appe
1d030 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
1d040 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
1d050 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
1d060 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
1d070 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
1d080 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
1d090 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
1d0a0 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
1d0b0 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  able is NULL..**
1d0c0 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73  .** A SrcList is
1d0d0 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1d0e0 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  LL if there is a
1d0f0 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68  n OOM error.  Th
1d100 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72  e returned.** Sr
1d110 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74  cList might be t
1d120 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53  he same as the S
1d130 72 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20  rcList that was 
1d140 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68  input or it migh
1d150 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  t be.** a new on
1d160 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  e.  If an OOM er
1d170 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c  ror does occurs,
1d180 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20   then the prior 
1d190 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a  value of pList.*
1d1a0 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20  * that is input 
1d1b0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1d1c0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
1d1d0 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
1d1e0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
1d1f0 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
1d200 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
1d210 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
1d220 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
1d230 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
1d240 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
1d250 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
1d260 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
1d270 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
1d280 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
1d290 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
1d2a0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
1d2b0 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
1d2c0 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
1d2d0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1d2e0 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
1d2f0 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
1d300 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
1d310 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1d320 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
1d330 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
1d340 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
1d350 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
1d360 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1d370 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
1d380 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
1d390 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
1d3a0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
1d3b0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1d3c0 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
1d3d0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1d3e0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1d3f0 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29  tAppend(D,A,B,0)
1d400 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
1d410 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
1d420 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1d430 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
1d440 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
1d450 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
1d460 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1d470 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1d480 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,C);.**.**
1d490 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
1d4a0 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
1d4b0 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1d4c0 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64  name.  If C is d
1d4d0 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73  efined.** then s
1d4e0 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65  o is B.  In othe
1d4f0 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65  r words, we neve
1d500 72 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68  r have a case wh
1d510 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ere:.**.**      
1d520 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1d530 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29  tAppend(D,A,0,C)
1d540 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61  ;.**.** Both pTa
1d550 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1d560 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f  e are assumed to
1d570 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65   be quoted.  The
1d580 79 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a  y are dequoted.*
1d590 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61  * before being a
1d5a0 64 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c  dded to the SrcL
1d5b0 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ist..*/.SrcList 
1d5c0 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1d5d0 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
1d5e0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1d5f0 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1d600 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1d610 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
1d620 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
1d630 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
1d640 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
1d650 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
1d660 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
1d670 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1d680 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
1d690 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
1d6a0 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
1d6b0 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
1d6c0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
1d6d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d6e0 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1d6f0 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
1d700 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
1d710 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
1d720 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
1d730 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1d740 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1d750 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1d760 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c  (db, sizeof(SrcL
1d770 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1d780 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1d790 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
1d7a0 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
1d7b0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1d7c0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1d7d0 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  db, pList, 1, pL
1d7e0 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66  ist->nSrc);.  if
1d7f0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1d800 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
1d810 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1d820 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
1d830 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1d840 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
1d850 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b  [pList->nSrc-1];
1d860 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
1d870 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
1d880 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==0 ){.    pData
1d890 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
1d8a0 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29 7b  if( pDatabase ){
1d8b0 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d  .    Token *pTem
1d8c0 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20  p = pDatabase;. 
1d8d0 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70     pDatabase = p
1d8e0 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c  Table;.    pTabl
1d8f0 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20  e = pTemp;.  }. 
1d900 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
1d910 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1d920 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29  oken(db, pTable)
1d930 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  ;.  pItem->zData
1d940 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  base = sqlite3Na
1d950 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1d960 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65  pDatabase);.  re
1d970 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
1d980 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65  *.** Assign Vdbe
1d990 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d  Cursor index num
1d9a0 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  bers to all tabl
1d9b0 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
1d9c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1d9d0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1d9e0 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
1d9f0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
1da00 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
1da10 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1da20 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
1da30 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61  ert(pList || pPa
1da40 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1da50 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
1da60 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
1da70 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
1da80 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  ->a; i<pList->nS
1da90 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
1daa0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
1dab0 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
1dac0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49   break;.      pI
1dad0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
1dae0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1daf0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1db00 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
1db10 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1db20 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
1db30 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
1db40 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
1db50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1db60 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
1db70 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
1db80 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
1db90 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
1dba0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dbb0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73  3SrcListDelete(s
1dbc0 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
1dbd0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1dbe0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
1dbf0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1dc00 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
1dc10 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1dc20 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
1dc30 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
1dc40 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
1dc50 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
1dc60 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1dc70 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
1dc80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1dc90 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
1dca0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1dcb0 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1dcc0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71  >zAlias);.    sq
1dcd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1dce0 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  pItem->zIndex);.
1dcf0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
1dd00 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d  eTable(db, pItem
1dd10 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
1dd20 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1dd30 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
1dd40 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
1dd50 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1dd60 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pItem->pOn);.   
1dd70 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1dd80 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1dd90 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73  pUsing);.  }.  s
1dda0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ddb0 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
1ddc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1ddd0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1dde0 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20  parser to add a 
1ddf0 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a  new term to the.
1de00 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77  ** end of a grow
1de10 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ing FROM clause.
1de20 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65    The "p" parame
1de30 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20  ter is the part 
1de40 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  of.** the FROM c
1de50 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61  lause that has a
1de60 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73  lready been cons
1de70 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73  tructed.  "p" is
1de80 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73   NULL.** if this
1de90 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
1dea0 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
1deb0 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61  lause.  pTable a
1dec0 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  nd pDatabase.** 
1ded0 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  are the name of 
1dee0 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61  the table and da
1def0 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20  tabase named in 
1df00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1df10 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61  term..** pDataba
1df20 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  se is NULL if th
1df30 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1df40 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73  qualifier is mis
1df50 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73  sing - the.** us
1df60 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68  ual case.  If th
1df70 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c  e term has an al
1df80 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73  ias, then pAlias
1df90 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
1dfa0 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20  * alias token.  
1dfb0 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61  If the term is a
1dfc0 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20   subquery, then 
1dfd0 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65  pSubquery is the
1dfe0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
1dff0 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75  ment that the su
1e000 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20  bquery encodes. 
1e010 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a   The pTable and.
1e020 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72  ** pDatabase par
1e030 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c  ameters are NULL
1e040 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e   for subqueries.
1e050 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55    The pOn and pU
1e060 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65  sing.** paramete
1e070 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65  rs are the conte
1e080 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64  nt of the ON and
1e090 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a   USING clauses..
1e0a0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e  **.** Return a n
1e0b0 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68  ew SrcList which
1e0c0 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20   encodes is the 
1e0d0 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65  FROM with the ne
1e0e0 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e  w.** term added.
1e0f0 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1e100 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1e110 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72  dFromTerm(.  Par
1e120 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1e130 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1e140 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
1e150 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20  List *p,        
1e160 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
1e170 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f   part of the FRO
1e180 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79  M clause already
1e190 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e   seen */.  Token
1e1a0 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20   *pTable,       
1e1b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1e1c0 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74  e table to add t
1e1d0 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  o the FROM claus
1e1e0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  e */.  Token *pD
1e1f0 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f  atabase,       /
1e200 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1e210 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
1e220 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  g pTable */.  To
1e230 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20  ken *pAlias,    
1e240 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
1e250 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
1e260 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73  the AS subexpres
1e270 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  sion */.  Select
1e280 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20   *pSubquery,    
1e290 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20    /* A subquery 
1e2a0 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
1e2b0 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f   a table name */
1e2c0 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20  .  Expr *pOn,   
1e2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e2e0 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
1e2f0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73   join */.  IdLis
1e300 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20  t *pUsing       
1e310 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20     /* The USING 
1e320 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
1e330 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
1e340 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1e350 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
1e360 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1e370 0a 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f  .  if( !p && (pO
1e380 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a  n || pUsing) ){.
1e390 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1e3a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a  Msg(pParse, "a J
1e3b0 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65  OIN clause is re
1e3c0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73  quired before %s
1e3d0 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f  ", .      (pOn ?
1e3e0 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29   "ON" : "USING")
1e3f0 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f  .    );.    goto
1e400 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
1e410 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  or;.  }.  p = sq
1e420 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1e430 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65  nd(db, p, pTable
1e440 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
1e450 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
1e460 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b  R(p->nSrc==0) ){
1e470 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64  .    goto append
1e480 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d  _from_error;.  }
1e490 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  .  pItem = &p->a
1e4a0 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61  [p->nSrc-1];.  a
1e4b0 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30  ssert( pAlias!=0
1e4c0 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73   );.  if( pAlias
1e4d0 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d  ->n ){.    pItem
1e4e0 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
1e4f0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1e500 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d  db, pAlias);.  }
1e510 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  .  pItem->pSelec
1e520 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20  t = pSubquery;. 
1e530 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f   pItem->pOn = pO
1e540 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69  n;.  pItem->pUsi
1e550 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72  ng = pUsing;.  r
1e560 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e  eturn p;.. appen
1e570 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20  d_from_error:.  
1e580 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
1e590 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1e5a0 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20  ete(db, pOn);.  
1e5b0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1e5c0 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b  ete(db, pUsing);
1e5d0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1e5e0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71  Delete(db, pSubq
1e5f0 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20  uery);.  return 
1e600 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
1e610 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72  an INDEXED BY or
1e620 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
1e630 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20  use to the most 
1e640 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a  recently added .
1e650 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ** element of th
1e660 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61  e source-list pa
1e670 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
1e680 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
1e690 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1e6a0 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72  istIndexedBy(Par
1e6b0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1e6c0 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70  ist *p, Token *p
1e6d0 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73  IndexedBy){.  as
1e6e0 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79  sert( pIndexedBy
1e6f0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26  !=0 );.  if( p &
1e700 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63  & ALWAYS(p->nSrc
1e710 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  >0) ){.    struc
1e720 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1e730 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
1e740 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73  >nSrc-1];.    as
1e750 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74  sert( pItem->not
1e760 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20 70 49  Indexed==0 && pI
1e770 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20 29  tem->zIndex==0 )
1e780 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
1e790 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70  edBy->n==1 && !p
1e7a0 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a  IndexedBy->z ){.
1e7b0 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20        /* A "NOT 
1e7c0 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20  INDEXED" clause 
1e7d0 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65  was supplied. Se
1e7e0 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20  e parse.y .     
1e7f0 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69   ** construct "i
1e800 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20  ndexed_opt" for 
1e810 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
1e820 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65    pItem->notInde
1e830 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  xed = 1;.    }el
1e840 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  se{.      pItem-
1e850 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  >zIndex = sqlite
1e860 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
1e870 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65  Parse->db, pInde
1e880 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20  xedBy);.    }.  
1e890 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  }.}../*.** When 
1e8a0 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52  building up a FR
1e8b0 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  OM clause in the
1e8c0 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69   parser, the joi
1e8d0 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  n operator.** is
1e8e0 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63   initially attac
1e8f0 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
1e900 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68  operand.  But th
1e910 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
1e920 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20  .** expects the 
1e930 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f  join operator to
1e940 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74   be on the right
1e950 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20   operand.  This 
1e960 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74  routine.** Shift
1e970 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61  s all join opera
1e980 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74  tors from left t
1e990 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65  o right for an e
1e9a0 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c  ntire FROM.** cl
1e9b0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  ause..**.** Exam
1e9c0 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65  ple: Suppose the
1e9d0 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68   join is like th
1e9e0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1e9f0 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72      A natural cr
1ea00 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a  oss join B.**.**
1ea10 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   The operator is
1ea20 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20   "natural cross 
1ea30 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e  join".  The A an
1ea40 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65  d B operands are
1ea50 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d   stored.** in p-
1ea60 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31  >a[0] and p->a[1
1ea70 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  ], respectively.
1ea80 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69    The parser ini
1ea90 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68  tially stores th
1eaa0 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69  e.** operator wi
1eab0 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74  th A.  This rout
1eac0 69 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20  ine shifts that 
1ead0 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f  operator over to
1eae0 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   B..*/.void sqli
1eaf0 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a  te3SrcListShiftJ
1eb00 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20  oinType(SrcList 
1eb10 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
1eb20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
1eb30 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20  or(i=p->nSrc-1; 
1eb40 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  i>0; i--){.     
1eb50 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70   p->a[i].jointyp
1eb60 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f  e = p->a[i-1].jo
1eb70 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  intype;.    }.  
1eb80 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79    p->a[0].jointy
1eb90 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe = 0;.  }.}../
1eba0 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
1ebb0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1ebc0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61   sqlite3BeginTra
1ebd0 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
1ebe0 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65  pParse, int type
1ebf0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1ec00 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
1ec10 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
1ec20 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
1ec30 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1ec40 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
1ec50 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e   );./*  if( db->
1ec60 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1ec70 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28  return; */.  if(
1ec80 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1ec90 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1eca0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
1ecb0 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a  EGIN", 0, 0) ){.
1ecc0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1ecd0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1ece0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1ecf0 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b  if( !v ) return;
1ed00 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f  .  if( type!=TK_
1ed10 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20  DEFERRED ){.    
1ed20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1ed30 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
1ed40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ed50 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  2(v, OP_Transact
1ed60 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54  ion, i, (type==T
1ed70 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b  K_EXCLUSIVE)+1);
1ed80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ed90 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1eda0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
1edb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1edc0 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
1edd0 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
1ede0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e  ** Commit a tran
1edf0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
1ee00 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61  sqlite3CommitTra
1ee10 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
1ee20 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
1ee30 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *v;..  assert( p
1ee40 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
1ee50 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1ee60 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  !=0 );.  if( sql
1ee70 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ee80 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1ee90 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
1eea0 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  T", 0, 0) ){.   
1eeb0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
1eec0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1eed0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1eee0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1eef0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ef00 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
1ef10 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1ef20 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
1ef30 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1ef40 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
1ef50 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1ef60 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
1ef70 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74  be *v;..  assert
1ef80 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
1ef90 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1efa0 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  >db!=0 );.  if( 
1efb0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1efc0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1efd0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f  TRANSACTION, "RO
1efe0 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29  LLBACK", 0, 0) )
1eff0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1f000 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
1f010 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1f020 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
1f030 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f040 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
1f050 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 1);.  }.}.
1f060 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f070 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
1f080 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65  y the parser whe
1f090 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63 6f  n it parses a co
1f0a0 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c  mmand to create,
1f0b0 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72  .** release or r
1f0c0 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73  ollback an SQL s
1f0d0 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f  avepoint. .*/.vo
1f0e0 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f  id sqlite3Savepo
1f0f0 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  int(Parse *pPars
1f100 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e  e, int op, Token
1f110 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
1f120 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
1f130 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
1f140 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
1f150 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
1f160 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
1f170 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1f180 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
1f190 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
1f1a0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74  ORIZATION.    st
1f1b0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1f1c0 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b  * const az[] = {
1f1d0 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41   "BEGIN", "RELEA
1f1e0 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20  SE", "ROLLBACK" 
1f1f0 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  };.    assert( !
1f200 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20  SAVEPOINT_BEGIN 
1f210 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  && SAVEPOINT_REL
1f220 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50  EASE==1 && SAVEP
1f230 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32  OINT_ROLLBACK==2
1f240 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
1f250 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33  f( !v || sqlite3
1f260 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1f270 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49  , SQLITE_SAVEPOI
1f280 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d  NT, az[op], zNam
1f290 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e, 0) ){.      s
1f2a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1f2b0 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b  rse->db, zName);
1f2c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
1f2d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1f2e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1f2f0 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20  _Savepoint, op, 
1f300 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f  0, 0, zName, P4_
1f310 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
1f320 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1f330 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1f340 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61  se is open and a
1f350 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
1f360 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
1f370 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1f380 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72  s.  Leave any er
1f390 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20  ror messages in 
1f3a0 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
1f3b0 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
1f3c0 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
1f3d0 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  base(Parse *pPar
1f3e0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
1f3f0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1f400 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31  .  if( db->aDb[1
1f410 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61  ].pBt==0 && !pPa
1f420 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
1f430 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1f440 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20  Btree *pBt;.    
1f450 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
1f460 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20   flags = .      
1f470 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1f480 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20  READWRITE |.    
1f490 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1f4a0 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
1f4b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1f4c0 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
1f4d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1f4e0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1f4f0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1f500 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1f510 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
1f520 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
1f530 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70  >pVfs, 0, db, &p
1f540 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20  Bt, 0, flags);. 
1f550 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1f570 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1f580 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
1f590 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
1f5a0 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
1f5b0 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
1f5c0 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
1f5d0 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
1f5e0 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
1f5f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1f600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
1f610 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74  aDb[1].pBt = pBt
1f620 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
1f630 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
1f640 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
1f650 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65  TE_NOMEM==sqlite
1f660 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
1f670 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50  e(pBt, db->nextP
1f680 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20  agesize, -1, 0) 
1f690 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
1f6a0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
1f6b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1f6c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1f6d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
1f6e0 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
1f6f0 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  at the schema co
1f700 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  okie will need t
1f710 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a 2a  o be verified.**
1f720 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44   for database iD
1f730 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f 20  b.  The code to 
1f740 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79 20  actually verify 
1f750 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
1f760 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20  e.** will occur 
1f770 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1f780 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45  e top-level VDBE
1f790 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65 6e   and will be gen
1f7a0 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c  erated.** later,
1f7b0 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69 73   by sqlite3Finis
1f7c0 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f  hCoding()..*/.vo
1f7d0 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
1f7e0 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65  rifySchema(Parse
1f7f0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
1f800 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
1f810 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1f820 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1f830 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
1f840 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c   *db = pToplevel
1f850 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
1f860 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
1f870 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
1f880 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
1f890 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
1f8a0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
1f8b0 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db<SQLITE_MAX_AT
1f8c0 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73  TACHED+2 );.  as
1f8d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1f8e0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1f8f0 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66   iDb, 0) );.  if
1f900 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54 6f  ( DbMaskTest(pTo
1f910 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61  plevel->cookieMa
1f920 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20  sk, iDb)==0 ){. 
1f930 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f     DbMaskSet(pTo
1f940 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61  plevel->cookieMa
1f950 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 70 54  sk, iDb);.    pT
1f960 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56  oplevel->cookieV
1f970 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e  alue[iDb] = db->
1f980 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
1f990 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b  ->schema_cookie;
1f9a0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
1f9b0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
1f9c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f9d0 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1f9e0 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
1f9f0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1fa00 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20  If argument zDb 
1fa10 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61  is NULL, then ca
1fa20 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  ll sqlite3CodeVe
1fa30 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72  rifySchema() for
1fa40 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68   each .** attach
1fa50 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68  ed database. Oth
1fa60 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69  erwise, invoke i
1fa70 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
1fa80 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c  se named zDb onl
1fa90 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
1faa0 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
1fab0 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  dSchema(Parse *p
1fac0 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
1fad0 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74  r *zDb){.  sqlit
1fae0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1faf0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
1fb00 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1fb10 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
1fb20 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
1fb30 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
1fb40 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c  ->pBt && (!zDb |
1fb50 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  | 0==sqlite3StrI
1fb60 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e  Cmp(zDb, pDb->zN
1fb70 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73  ame)) ){.      s
1fb80 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1fb90 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
1fba0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1fbb0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
1fbc0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
1fbd0 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
1fbe0 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
1fbf0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1fc00 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
1fc10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1fc20 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
1fc30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
1fc40 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
1fc50 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
1fc60 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
1fc70 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
1fc80 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
1fc90 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
1fca0 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
1fcb0 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
1fcc0 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
1fcd0 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
1fce0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
1fcf0 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
1fd00 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
1fd10 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
1fd20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
1fd30 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
1fd40 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
1fd50 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
1fd60 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
1fd70 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1fd80 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
1fd90 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
1fda0 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
1fdb0 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
1fdc0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
1fdd0 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
1fde0 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
1fdf0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
1fe00 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
1fe10 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
1fe20 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
1fe30 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
1fe40 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
1fe50 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  be set..*/.void 
1fe60 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1fe70 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
1fe80 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
1fe90 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20  tStatement, int 
1fea0 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  iDb){.  Parse *p
1feb0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1fec0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1fed0 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
1fee0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1fef0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
1ff00 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f  .  DbMaskSet(pTo
1ff10 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73  plevel->writeMas
1ff20 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c  k, iDb);.  pTopl
1ff30 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
1ff40 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65  te |= setStateme
1ff50 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  nt;.}../*.** Ind
1ff60 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73  icate that the s
1ff70 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74  tatement current
1ff80 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
1ff90 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74  ction might writ
1ffa0 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e.** more than o
1ffb0 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c  ne entry (exampl
1ffc0 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20  e: deleting one 
1ffd0 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69  row then inserti
1ffe0 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69  ng another,.** i
1fff0 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c  nserting multipl
20000 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c  e rows in a tabl
20010 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  e, or inserting 
20020 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20  a row and index 
20030 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20  entries.).** If 
20040 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20  an abort occurs 
20050 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68  after some of th
20060 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20  ese writes have 
20070 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20  completed, then 
20080 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65  it will.** be ne
20090 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
200a0 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72  the completed wr
200b0 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ites..*/.void sq
200c0 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
200d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
200e0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
200f0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
20100 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
20110 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
20120 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31  isMultiWrite = 1
20130 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  ;.}../* .** The 
20140 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63  code generator c
20150 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
20160 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72  e if is discover
20170 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20  s that it is.** 
20180 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72  possible to abor
20190 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72  t a statement pr
201a0 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  ior to completio
201b0 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  n.  In order to 
201c0 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73  .** perform this
201d0 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63   abort without c
201e0 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61  orrupting the da
201f0 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20  tabase, we need 
20200 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  to make.** sure 
20210 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
20220 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  nt is protected 
20230 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  by a statement t
20240 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
20250 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77  * Technically, w
20260 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73  e only need to s
20270 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20  et the mayAbort 
20280 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69  flag if the.** i
20290 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67  sMultiWrite flag
202a0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
202b0 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61  set.  There is a
202c0 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
202d0 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68  .** such that th
202e0 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63  e abort must occ
202f0 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c  ur after the mul
20300 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d  tiwrite.  This m
20310 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61  akes.** some sta
20320 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e  tements involvin
20330 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f  g the REPLACE co
20340 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
20350 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67  n algorithm.** g
20360 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65  o a little faste
20370 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61  r.  But taking a
20380 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73  dvantage of this
20390 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
203a0 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72  .** makes it mor
203b0 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70  e difficult to p
203c0 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f  rove that the co
203d0 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69  de is correct (i
203e0 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72  n .** particular
203f0 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73  , it prevents us
20400 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e   from writing an
20410 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d   effective.** im
20420 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
20430 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
20440 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20  Abort()) and so 
20450 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a  we have chosen.*
20460 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61  * to take the sa
20470 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69  fe route and ski
20480 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  p the optimizati
20490 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
204a0 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73  te3MayAbort(Pars
204b0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
204c0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
204d0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
204e0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
204f0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41   pToplevel->mayA
20500 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  bort = 1;.}../*.
20510 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
20520 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74  lt that causes t
20530 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72  he vdbe to retur
20540 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n an SQLITE_CONS
20550 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e  TRAINT.** error.
20560 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72   The onError par
20570 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
20580 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29  s which (if any)
20590 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
205a0 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72  t.** and/or curr
205b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
205c0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
205d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48  */.void sqlite3H
205e0 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  altConstraint(. 
205f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
20600 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20610 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntext */.  int e
20620 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20  rrCode,      /* 
20630 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63  extended error c
20640 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ode */.  int onE
20650 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
20660 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f  nstraint type */
20670 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20  .  char *p4,    
20680 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
20690 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34  ssage */.  i8 p4
206a0 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  type,        /* 
206b0 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f  P4_STATIC or P4_
206c0 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75  TRANSIENT */.  u
206d0 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20  8 p5Errmsg      
206e0 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79   /* P5_ErrMsg ty
206f0 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  pe */.){.  Vdbe 
20700 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
20710 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
20720 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26  ssert( (errCode&
20730 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
20740 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66  NSTRAINT );.  if
20750 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  ( onError==OE_Ab
20760 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ort ){.    sqlit
20770 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
20780 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
20790 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
207a0 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c  P_Halt, errCode,
207b0 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c   onError, 0, p4,
207c0 20 70 34 74 79 70 65 29 3b 0a 20 20 69 66 28 20   p4type);.  if( 
207d0 70 35 45 72 72 6d 73 67 20 29 20 73 71 6c 69 74  p5Errmsg ) sqlit
207e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
207f0 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a  , p5Errmsg);.}..
20800 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
20810 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49  _Halt due to UNI
20820 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
20830 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  EY constraint vi
20840 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  olation..*/.void
20850 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f   sqlite3UniqueCo
20860 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
20870 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
20880 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
20890 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
208a0 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
208b0 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
208c0 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
208d0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
208e0 68 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65  hat triggers the
208f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29   constraint */.)
20900 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  {.  char *zErr;.
20910 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63    int j;.  StrAc
20920 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61  cum errMsg;.  Ta
20930 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78  ble *pTab = pIdx
20940 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c  ->pTable;..  sql
20950 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
20960 28 26 65 72 72 4d 73 67 2c 20 30 2c 20 30 2c 20  (&errMsg, 0, 0, 
20970 32 30 30 29 3b 0a 20 20 65 72 72 4d 73 67 2e 64  200);.  errMsg.d
20980 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
20990 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
209a0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
209b0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  {.    char *zCol
209c0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49   = pTab->aCol[pI
209d0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  dx->aiColumn[j]]
209e0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
209f0 6a 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  j ) sqlite3StrAc
20a00 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73  cumAppend(&errMs
20a10 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20  g, ", ", 2);.   
20a20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
20a30 41 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73  AppendAll(&errMs
20a40 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  g, pTab->zName);
20a50 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
20a60 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d  ccumAppend(&errM
20a70 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20  sg, ".", 1);.   
20a80 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
20a90 41 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73  AppendAll(&errMs
20aa0 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  g, zCol);.  }.  
20ab0 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74  zErr = sqlite3St
20ac0 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72  rAccumFinish(&er
20ad0 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
20ae0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
20af0 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72  Parse, .    IsPr
20b00 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
20b10 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e  dx) ? SQLITE_CON
20b20 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
20b30 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY .            
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b50 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  : SQLITE_CONSTRA
20b60 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20  INT_UNIQUE,.    
20b70 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50  onError, zErr, P
20b80 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f  4_DYNAMIC, P5_Co
20b90 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
20ba0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  .}.../*.** Code 
20bb0 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
20bc0 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77  o non-unique row
20bd0 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  id..*/.void sqli
20be0 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69  te3RowidConstrai
20bf0 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
20c00 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
20c10 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
20c20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
20c30 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
20c40 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
20c50 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  hm */.  Table *p
20c60 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Tab       /* The
20c70 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
20c80 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
20c90 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a   */ .){.  char *
20ca0 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zMsg;.  int rc;.
20cb0 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
20cc0 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67  y>=0 ){.    zMsg
20cd0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
20ce0 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
20cf0 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
20d00 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
20d20 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
20d30 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
20d40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
20d50 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
20d60 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KEY;.  }else{.  
20d70 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
20d80 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
20d90 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20  db, "%s.rowid", 
20da0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
20db0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
20dc0 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a  NSTRAINT_ROWID;.
20dd0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c    }.  sqlite3Hal
20de0 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
20df0 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c  se, rc, onError,
20e00 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
20e10 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
20e20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f             P5_Co
20e30 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
20e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
20e50 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78  to see if pIndex
20e60 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
20e70 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
20e80 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ll.  Return.** t
20e90 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61  rue if it does a
20ea0 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64  nd false if it d
20eb0 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e  oes not..*/.#ifn
20ec0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20ed0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69  REINDEX.static i
20ee0 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  nt collationMatc
20ef0 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  h(const char *zC
20f00 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
20f10 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ex){.  int i;.  
20f20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30  assert( zColl!=0
20f30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
20f40 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
20f50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
20f60 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64  t char *z = pInd
20f70 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  ex->azColl[i];. 
20f80 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
20f90 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  || pIndex->aiCol
20fa0 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20  umn[i]<0 );.    
20fb0 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
20fc0 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d  lumn[i]>=0 && 0=
20fd0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
20fe0 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  z, zColl) ){.   
20ff0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
21000 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21010 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
21020 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
21030 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
21040 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f   that use the co
21050 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
21060 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43   pColl..** If pC
21070 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
21080 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
21090 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69  s of pTab..*/.#i
210a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
210b0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
210c0 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62   void reindexTab
210d0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
210e0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  , Table *pTab, c
210f0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
21100 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
21110 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
21120 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
21130 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
21140 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64  b */..  for(pInd
21150 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  ex=pTab->pIndex;
21160 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
21170 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a  pIndex->pNext){.
21180 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30      if( zColl==0
21190 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74   || collationMat
211a0 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78  ch(zColl, pIndex
211b0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
211c0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
211d0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
211e0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
211f0 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ema);.      sqli
21200 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
21210 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
21220 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
21230 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
21240 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
21250 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
21260 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
21270 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
21280 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
21290 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
212a0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
212b0 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
212c0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
212d0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
212e0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
212f0 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
21300 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
21310 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
21320 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
21330 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
21340 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
21350 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
21360 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
21370 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  {.  Db *pDb;    
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61  /* A single data
213a0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
213b0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
213c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
213d0 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
213e0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
213f0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
21400 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
21410 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
21420 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
21430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21440 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
21450 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44  ver tables in pD
21460 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
21470 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
21480 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
21490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
214a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
214b0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
214c0 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20  Mutexes(db) );  
214d0 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63  /* Needed for sc
214e0 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20  hema access */. 
214f0 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
21500 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
21510 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
21520 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
21530 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66   pDb!=0 );.    f
21540 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
21550 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65  irst(&pDb->pSche
21560 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b  ma->tblHash);  k
21570 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
21580 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(k)){.      pT
21590 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
215a0 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
215b0 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62        reindexTab
215c0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
215d0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   zColl);.    }. 
215e0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
215f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
21600 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58   for the REINDEX
21610 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
21620 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
21650 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
21660 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20    <collation>   
21670 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
21680 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
21690 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
216a0 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
216b0 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   3.**        REI
216c0 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
216d0 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20  >.?<indexname>  
216e0 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20  -- 4.**.** Form 
216f0 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64  1 causes all ind
21700 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61  ices in all atta
21710 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
21720 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a  o be rebuilt..**
21730 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73   Form 2 rebuilds
21740 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
21750 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68  all databases th
21760 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64  at use the named
21770 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  .** collating fu
21780 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33  nction.  Forms 3
21790 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74   and 4 rebuild t
217a0 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f  he named index o
217b0 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73  r all.** indices
217c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
217d0 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
217e0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
217f0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
21800 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69  .void sqlite3Rei
21810 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
21820 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
21830 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  1, Token *pName2
21840 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
21850 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
21860 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
21870 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69  quence to be rei
21880 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  ndexed, or NULL 
21890 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61   /* Name of a ta
218c0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  ble or index */.
218d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
218e0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
218f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
21900 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  abase */.  Table
21910 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
21920 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
21930 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
21940 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
21950 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
21960 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
21970 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
21980 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  Tab */.  int iDb
21990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
219a0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
219b0 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
219c0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
219d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
219e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
219f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
21a00 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61  .  Token *pObjNa
21a10 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
21a20 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
21a30 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
21a40 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a  be reindexed */.
21a50 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
21a60 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
21a70 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
21a80 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
21a90 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
21aa0 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
21ab0 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
21ac0 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
21ad0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
21ae0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
21af0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
21b00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d  .  }..  if( pNam
21b10 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69  e1==0 ){.    rei
21b20 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
21b30 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65  arse, 0);.    re
21b40 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
21b50 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d  ( NEVER(pName2==
21b60 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  0) || pName2->z=
21b70 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
21b80 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72  zColl;.    asser
21b90 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a  t( pName1->z );.
21ba0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69      zColl = sqli
21bb0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
21bc0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
21bd0 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  me1);.    if( !z
21be0 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  Coll ) return;. 
21bf0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
21c00 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
21c10 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
21c20 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
21c30 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69  oll ){.      rei
21c40 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
21c50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
21c60 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21c70 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
21c80 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
21c90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
21ca0 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
21cb0 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
21cc0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
21cd0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
21ce0 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
21cf0 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
21d00 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
21d10 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
21d20 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65  ken(db, pObjName
21d30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
21d40 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20  return;.  zDb = 
21d50 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
21d60 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
21d70 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
21d80 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
21d90 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
21da0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
21db0 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
21dc0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21dd0 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
21de0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
21df0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
21e00 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
21e10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21e20 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
21e30 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
21e40 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
21e50 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
21e60 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
21e70 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
21e80 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
21e90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
21ea0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
21eb0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
21ec0 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
21ed0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
21ee0 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
21ef0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
21f00 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
21f10 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
21f20 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
21f30 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
21f40 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79  x..**.** The Key
21f50 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66  Info structure f
21f60 6f 72 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63  or an index is c
21f70 61 63 68 65 64 20 69 6e 20 74 68 65 20 49 6e 64  ached in the Ind
21f80 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f  ex object..** So
21f90 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
21fa0 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e  multiple referen
21fb0 63 65 73 20 74 6f 20 74 68 65 20 72 65 74 75 72  ces to the retur
21fc0 6e 65 64 20 70 6f 69 6e 74 65 72 2e 20 20 54 68  ned pointer.  Th
21fd0 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75  e.** caller shou
21fe0 6c 64 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f  ld not try to mo
21ff0 64 69 66 79 20 74 68 65 20 4b 65 79 49 6e 66 6f  dify the KeyInfo
22000 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
22010 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
22020 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b   invoke sqlite3K
22030 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e  eyInfoUnref() on
22040 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
22050 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20  ject.** when it 
22060 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69  has finished usi
22070 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  ng it..*/.KeyInf
22080 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
22090 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a  oOfIndex(Parse *
220a0 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
220b0 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
220c0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
220d0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
220e0 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b   nKey = pIdx->nK
220f0 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f  eyCol;.  KeyInfo
22100 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50   *pKey;.  if( pP
22110 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
22120 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64  urn 0;.  if( pId
22130 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29  x->uniqNotNull )
22140 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
22150 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
22160 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
22170 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20  y, nCol-nKey);. 
22180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
22190 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
221a0 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
221b0 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d  b, nCol, 0);.  }
221c0 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
221d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
221e0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
221f0 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20  able(pKey) );.  
22200 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
22210 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
22220 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
22230 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
22240 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c      assert( zCol
22250 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4b  l!=0 );.      pK
22260 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
22270 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e  trcmp(zColl,"BIN
22280 41 52 59 22 29 3d 3d 30 20 3f 20 30 20 3a 0a 20  ARY")==0 ? 0 :. 
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
222b0 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
222c0 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
222d0 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
222e0 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
222f0 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
22300 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73   }.    if( pPars
22310 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
22320 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
22330 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20  nref(pKey);.    
22340 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20    pKey = 0;.    
22350 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
22360 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Key;.}..#ifndef 
22370 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
22380 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
22390 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ine is invoked o
223a0 6e 63 65 20 70 65 72 20 43 54 45 20 62 79 20 74  nce per CTE by t
223b0 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
223c0 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49  parsing a .** WI
223d0 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57  TH clause. .*/.W
223e0 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68  ith *sqlite3With
223f0 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Add(.  Parse *pP
22400 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
22410 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
22420 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  t */.  With *pWi
22430 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
22440 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54 48 20  * Existing WITH 
22450 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
22460 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
22470 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
22480 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d  Name of the comm
22490 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  on-table */.  Ex
224a0 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74  prList *pArglist
224b0 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61  ,     /* Optiona
224c0 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69  l column name li
224d0 73 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  st for the table
224e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51   */.  Select *pQ
224f0 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a  uery          /*
22500 20 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 69   Query used to i
22510 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61  nitialize the ta
22520 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ble */.){.  sqli
22530 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
22540 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e  ->db;.  With *pN
22550 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ew;.  char *zNam
22560 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
22570 68 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65  hat the CTE name
22580 20 69 73 20 75 6e 69 71 75 65 20 77 69 74 68 69   is unique withi
22590 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c 61 75  n this WITH clau
225a0 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c  se. If.  ** not,
225b0 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20   store an error 
225c0 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
225d0 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61  ucture. */.  zNa
225e0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
225f0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
22600 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
22610 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69  if( zName && pWi
22620 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
22630 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
22640 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
22650 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
22660 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
22670 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a  e, pWith->a[i].z
22680 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
22690 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
226a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
226b0 6c 69 63 61 74 65 20 57 49 54 48 20 74 61 62 6c  licate WITH tabl
226c0 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61  e name: %s", zNa
226d0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
226e0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57   }.  }..  if( pW
226f0 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ith ){.    int n
22700 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
22710 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28  With) + (sizeof(
22720 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70  pWith->a[1]) * p
22730 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20  With->nCte);.   
22740 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
22750 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69  bRealloc(db, pWi
22760 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  th, nByte);.  }e
22770 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  lse{.    pNew = 
22780 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
22790 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
227a0 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61  pWith));.  }.  a
227b0 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
227c0 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 20 20  || pNew==0 );.  
227d0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
227e0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70  ocFailed==0 || p
227f0 4e 65 77 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  New==0 );..  if(
22800 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
22810 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
22820 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69  elete(db, pArgli
22830 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
22840 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
22850 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71   pQuery);.    sq
22860 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22870 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
22880 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73   = pWith;.  }els
22890 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  e{.    pNew->a[p
228a0 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65  New->nCte].pSele
228b0 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20  ct = pQuery;.   
228c0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
228d0 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72  Cte].pCols = pAr
228e0 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d  glist;.    pNew-
228f0 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
22900 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
22910 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
22920 6e 43 74 65 5d 2e 7a 45 72 72 20 3d 20 30 3b 0a  nCte].zErr = 0;.
22930 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b      pNew->nCte++
22940 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
22950 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
22960 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ree the contents
22970 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a   of the With obj
22980 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
22990 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
229a0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
229b0 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c  e3WithDelete(sql
229c0 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a  ite3 *db, With *
229d0 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57  pWith){.  if( pW
229e0 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
229f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22a00 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
22a10 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
22a20 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57   Cte *pCte = &pW
22a30 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  ith->a[i];.     
22a40 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22a50 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
22a60 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73  >pCols);.      s
22a70 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
22a80 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  te(db, pCte->pSe
22a90 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
22aa0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
22ab0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
22ac0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
22ad0 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b  Free(db, pWith);
22ae0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
22af0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22b00 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a        _OMIT_CTE) */.