/ Hex Artifact Content
Login

Artifact 5e4d105d5fc77b0fd824a590ee2a596ee2e4fd40:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0f40: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0f50: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0f60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f90: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
0fc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
0fd0: 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e  gin by generatin
0fe0: 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69  g some terminati
0ff0: 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65  on code at the e
1000: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76  nd of the.  ** v
1010: 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f  dbe program.  */
1020: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1030: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1040: 20 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65   assert( !pParse
1050: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a  ->isMultiWrite .
1060: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1070: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
1080: 6f 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d  ort(v, pParse->m
1090: 61 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28  ayAbort));.  if(
10a0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
10b0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10c0: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
10d0: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
10e0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
10f0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1100: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1110: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1120: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1130: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1140: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1150: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
1160: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1170: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
1180: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1190: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
11a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
11b0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
11c0: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
11d0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
11e0: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
11f0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1200: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1210: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1220: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79  oto>0 ){.      y
1230: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20  DbMask mask;.   
1240: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
1250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1260: 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d  pHere(v, pParse-
1270: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a  >cookieGoto-1);.
1280: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c        for(iDb=0,
1290: 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d   mask=1; iDb<db-
12a0: 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20  >nDb; mask<<=1, 
12b0: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iDb++){.        
12c0: 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72  if( (mask & pPar
12d0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d  se->cookieMask)=
12e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1310: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
1320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1330: 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c  ,OP_Transaction,
1340: 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50   iDb, (mask & pP
1350: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29  arse->writeMask)
1360: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
1370: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1390: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13a0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13b0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
13c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13e0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20  VerifyCookie,.  
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 69 44 62 2c 20 70            iDb, p
1410: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
1420: 75 65 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20  ue[iDb],.       
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1450: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65  ].pSchema->iGene
1460: 72 61 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ration);.       
1470: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64   }.      }.#ifnd
1480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1490: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
14a0: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
14b0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
14c0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56  =0; i<pParse->nV
14d0: 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  tabLock; i++){. 
14e0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76           char *v
14f0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1500: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1510: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1520: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1540: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65  AddOp4(v, OP_VBe
1550: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74  gin, 0, 0, 0, vt
1560: 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
1570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1580: 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63  pParse->nVtabLoc
1590: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  k = 0;.      }.#
15a0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
15b0: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
15c0: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
15d0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
15e0: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
15f0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
1600: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
1610: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
1620: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1630: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1640: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1650: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1660: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1670: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1680: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1690: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
16a0: 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  y AUTOINCREMENT 
16b0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
16c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
16d0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
16e0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67  AutoincrementBeg
16f0: 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  in(pParse);..   
1700: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1710: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1720: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1730: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1740: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1750: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1760: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
1770: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b  se->cookieGoto);
1780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1790: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
17a0: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
17b0: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
17c0: 20 20 69 66 28 20 76 20 26 26 20 41 4c 57 41 59    if( v && ALWAY
17d0: 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  S(pParse->nErr==
17e0: 30 29 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  0) && !db->mallo
17f0: 63 46 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65  cFailed ){.#ifde
1800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1810: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
1820: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
1830: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21  LITE_VdbeTrace)!
1840: 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b  =0 ? stdout : 0;
1850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1860: 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b  Trace(v, trace);
1870: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
1880: 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
1890: 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f  heLevel==0 );  /
18a0: 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72  * Disables and r
18b0: 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20  e-enables match 
18c0: 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69  */.    /* A mini
18d0: 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f  mum of one curso
18e0: 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69 66  r is required if
18f0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69   autoincrement i
1900: 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65  s used.    *  Se
1910: 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37  e ticket [a69637
1920: 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20  9c1f08866] */.  
1930: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41    if( pParse->pA
1940: 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73 65  inc!=0 && pParse
1950: 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72  ->nTab==0 ) pPar
1960: 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20  se->nTab = 1;.  
1970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
1980: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
1990: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
19a0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
19b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
19c0: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
19d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
19e0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
19f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
1a00: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
1a10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
1a20: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
1a30: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1a40: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72  nVar = 0;.  pPar
1a50: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d  se->cookieMask =
1a60: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1a70: 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a  okieGoto = 0;.}.
1a80: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1a90: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1aa0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1ab0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1ac0: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1ad0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1ae0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1af0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b00: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1b10: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1b20: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1b30: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1b40: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1b50: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1b60: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1b70: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1b80: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1b90: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1ba0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1bb0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1bc0: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1bd0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1be0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1bf0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1c00: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1c10: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1c20: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1c30: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1c40: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1c50: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1c60: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1c70: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1c80: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1c90: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1ca0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1cb0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1cc0: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1cd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ce0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1cf0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1d00: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1d10: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1d20: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
1d30: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
1d40: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
1d50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d60: 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45  b;.# define SAVE
1d70: 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72  _SZ  (sizeof(Par
1d80: 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50  se) - offsetof(P
1d90: 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68  arse,nVar)).  ch
1da0: 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f  ar saveBuf[SAVE_
1db0: 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  SZ];..  if( pPar
1dc0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
1dd0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
1de0: 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29  rse->nested<10 )
1df0: 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68  ;  /* Nesting sh
1e00: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20  ould only be of 
1e10: 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f  limited depth */
1e20: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1e30: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
1e40: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
1e50: 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  tf(db, zFormat, 
1e60: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1e70: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
1e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20   ){.    return; 
1e90: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75    /* A malloc mu
1ea0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1eb0: 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  /.  }.  pParse->
1ec0: 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63  nested++;.  memc
1ed0: 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61  py(saveBuf, &pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f  rse->nVar, SAVE_
1ef0: 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  SZ);.  memset(&p
1f00: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20  Parse->nVar, 0, 
1f10: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  SAVE_SZ);.  sqli
1f20: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
1f30: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
1f40: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1f50: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1f60: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f70: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
1f80: 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d   memcpy(&pParse-
1f90: 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20  >nVar, saveBuf, 
1fa0: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72  SAVE_SZ);.  pPar
1fb0: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
1fc0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1fd0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1fe0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1ff0: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
2000: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
2010: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
2020: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
2030: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
2040: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
2050: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
2060: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
2070: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
2080: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2090: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
20a0: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
20b0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
20c0: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
20d0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73   and the.** firs
20e0: 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  t matching table
20f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
2100: 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  No checking for 
2110: 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a  duplicate table.
2120: 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ** names is done
2130: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
2140: 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72  rder is TEMP fir
2150: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2160: 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c  hen any.** auxil
2170: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
2180: 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  dded using the A
2190: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
21a0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
21b0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
21c0: 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ()..*/.Table *sq
21d0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73  lite3FindTable(s
21e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
21f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
2200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
2210: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
2220: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
2230: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61    int nName;.  a
2240: 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
2250: 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  );.  nName = sql
2260: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
2270: 6d 65 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  me);.  /* All mu
2280: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
2290: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
22a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
22b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
22c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61 74  /.  assert( zDat
22d0: 61 62 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69  abase!=0 || sqli
22e0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
22f0: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
2300: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
2310: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
2320: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2330: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2340: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
2350: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2360: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
2370: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
2380: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2390: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
23a0: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
23b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
23c0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
23d0: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
23e0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
23f0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
2400: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
2410: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e  blHash, zName, n
2420: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
2430: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2440: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
2450: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2460: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2470: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2480: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2490: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
24a0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
24b0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
24c0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
24d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
24e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
24f0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
2500: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
2510: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
2520: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
2530: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2540: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
2550: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2560: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2570: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
2580: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2590: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
25a0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
25b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
25c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
25d0: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
25e0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
25f0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
2600: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
2610: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
2620: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2630: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
2640: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
2650: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rors */.  int is
2660: 56 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  View,           
2670: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b   /* True if look
2680: 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72  ing for a VIEW r
2690: 61 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42  ather than a TAB
26a0: 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LE */.  const ch
26b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f  ar *zName,     /
26c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
26d0: 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ble we are looki
26e0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  ng for */.  cons
26f0: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20  t char *zDbase  
2700: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2710: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67  e database.  Mig
2720: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
2730: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
2740: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2750: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2760: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2770: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2780: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2790: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
27a0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
27b0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
27c0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
27d0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
27e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
27f0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
2800: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
2810: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
2820: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
2830: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2840: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56  char *zMsg = isV
2850: 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76  iew ? "no such v
2860: 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20  iew" : "no such 
2870: 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20  table";.    if( 
2880: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
2890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28a0: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
28b0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73  %s", zMsg, zDbas
28c0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
28d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
28e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28f0: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
2900: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
2910: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
2920: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
2930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2940: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2950: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
2960: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
2970: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
2980: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
2990: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
29b0: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
29c0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
29d0: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
29e0: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
29f0: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
2a00: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
2a10: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
2a20: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
2a30: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
2a40: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
2a50: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
2a60: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
2a70: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
2a80: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
2a90: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
2aa0: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
2ab0: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
2ac0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2ad0: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
2ae0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20  *pParse, .  int 
2af0: 69 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63  isView, .  struc
2b00: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b10: 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  p.){.  const cha
2b20: 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74  r *zDb;.  assert
2b30: 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20  ( p->pSchema==0 
2b40: 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d  || p->zDatabase=
2b50: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
2b60: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e  Schema ){.    in
2b70: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
2b80: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
2b90: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68  rse->db, p->pSch
2ba0: 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20  ema);.    zDb = 
2bb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
2bc0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65  iDb].zName;.  }e
2bd0: 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70  lse{.    zDb = p
2be0: 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d  ->zDatabase;.  }
2bf0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2c00: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
2c10: 72 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e  rse, isView, p->
2c20: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
2c30: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2c40: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2c50: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2c60: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2c70: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2c80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2c90: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2ca0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
2cb0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
2cc0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
2cd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
2ce0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2cf0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
2d00: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2d10: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2d20: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2d30: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2d40: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2d50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2d60: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2d70: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2d80: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2d90: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2da0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2db0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2dc0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2dd0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2de0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2df0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2e00: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2e10: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2e20: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2e30: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2e40: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2e50: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2e60: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2e70: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2e80: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2e90: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2ea0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2eb0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2ec0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2ed0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2ee0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2ef0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2f00: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2f10: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2f20: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2f30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2f40: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2f50: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2f60: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2f70: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2f80: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2f90: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2fa0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2fb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2fc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2fd0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2fe0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ff0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
3000: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3010: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
3020: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
3030: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
3040: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
3050: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
3060: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3090: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
30a0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
30b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
30c0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
30d0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
30e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30f0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
3100: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
3110: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3120: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3130: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3140: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3150: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3160: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
3170: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  );.  if( p->isRe
3180: 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44  sized ) sqlite3D
3190: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 43  bFree(db, p->azC
31a0: 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  oll);.  sqlite3D
31b0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
31c0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
31d0: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
31e0: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
31f0: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
3200: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
3210: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
3220: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
3230: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
3240: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
3250: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
3260: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
3270: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
3280: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
3290: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
32a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
32b0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
32c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
32d0: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
32e0: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
32f0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
3300: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68   int len;.  Hash
3310: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
3320: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3330: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3340: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
3350: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
3360: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
3370: 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69  sh;.  len = sqli
3380: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 78  te3Strlen30(zIdx
3390: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20  Name);.  pIndex 
33a0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
33b0: 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e  ert(pHash, zIdxN
33c0: 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20 20  ame, len, 0);.  
33d0: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65  if( ALWAYS(pInde
33e0: 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  x) ){.    if( pI
33f0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3400: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
3410: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
3420: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
3430: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
3450: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f  ndex *p;.      /
3460: 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
3470: 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68  of ALWAYS();  Th
3480: 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
3490: 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20  on the list of. 
34a0: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e       ** indices.
34b0: 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49   */.      p = pI
34c0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
34d0: 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
34e0: 65 28 20 41 4c 57 41 59 53 28 70 29 20 26 26 20  e( ALWAYS(p) && 
34f0: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
3500: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
3510: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ; }.      if( AL
3520: 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65  WAYS(p && p->pNe
3530: 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20  xt==pIndex) ){. 
3540: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
3550: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3570: 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c     freeIndex(db,
3580: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20   pIndex);.  }.  
3590: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
35a0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
35b0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b  s;.}../*.** Look
35c0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73   through the lis
35d0: 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 61  t of open databa
35e0: 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e  se files in db->
35f0: 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20  aDb[] and if.** 
3600: 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63 6c  any have been cl
3610: 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65  osed, remove the
3620: 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e  m from the list.
3630: 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Reallocate the
3640: 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74  .** db->aDb[] st
3650: 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d 61  ructure to a sma
3660: 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70 6f  ller size, if po
3670: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e  ssible..**.** En
3680: 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69 6e  try 0 (the "main
3690: 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64 20  " database) and 
36a0: 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74 65  entry 1 (the "te
36b0: 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a 2a  mp" database).**
36c0: 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64 69   are never candi
36d0: 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67 20  dates for being 
36e0: 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f  collapsed..*/.vo
36f0: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  id sqlite3Collap
3700: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
3710: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
3720: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
3730: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
3740: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
3750: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
3760: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
3770: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
3780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3790: 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e  Free(db, pDb->zN
37a0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
37b0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
37c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
37d0: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
37e0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
37f0: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
3800: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
3810: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
3820: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
3830: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
3840: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
3850: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
3860: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
3870: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
3880: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
3890: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
38a0: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
38b0: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
38c0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ));.    sqlite3D
38d0: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
38e0: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
38f0: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
3900: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
3910: 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66  set the schema f
3920: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
3930: 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41  at index iDb.  A
3940: 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a  lso reset the.**
3950: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f   TEMP schema..*/
3960: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
3970: 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69  etOneSchema(sqli
3980: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3990: 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  ){.  Db *pDb;.  
39a0: 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
39b0: 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73  nDb );..  /* Cas
39c0: 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65 20  e 1:  Reset the 
39d0: 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69 64  single schema id
39e0: 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62 20  entified by iDb 
39f0: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
3a00: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65  aDb[iDb];.  asse
3a10: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3a20: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3a30: 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65  Db, 0) );.  asse
3a40: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
3a50: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
3a60: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
3a70: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a  >pSchema);..  /*
3a80: 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73 65   If any database
3a90: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d 50   other than TEMP
3aa0: 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e 20   is reset, then 
3ab0: 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50 0a  also reset TEMP.
3ac0: 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50 20    ** since TEMP 
3ad0: 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e 67  might be holding
3ae0: 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20 72   triggers that r
3af0: 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73 20  eference tables 
3b00: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  in the.  ** othe
3b10: 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  r database..  */
3b20: 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b  .  if( iDb!=1 ){
3b30: 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  .    pDb = &db->
3b40: 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65  aDb[1];.    asse
3b50: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
3b60: 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
3b70: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
3b80: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
3b90: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
3ba0: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
3bb0: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
3bc0: 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68   from all attach
3bd0: 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e  ed databases (in
3be0: 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e  cluding.** "main
3bf0: 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f  " and "temp") fo
3c00: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
3c10: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
3c20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
3c30: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
3c40: 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74  Connection(sqlit
3c50: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
3c60: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
3c70: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
3c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
3c90: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
3ca0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3cb0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3cc0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
3cd0: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
3ce0: 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65  Clear(pDb->pSche
3cf0: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ma);.    }.  }. 
3d00: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
3d10: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3d20: 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74  ges;.  sqlite3Vt
3d30: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
3d40: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
3d50: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20  LeaveAll(db);.  
3d60: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
3d70: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
3d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3d90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3da0: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
3db0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
3dc0: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
3dd0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
3de0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
3df0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
3e00: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
3e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
3e20: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
3e30: 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  d for the column
3e40: 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c   names of a tabl
3e50: 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a  e or view (the.*
3e60: 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61  * Table.aCol[] a
3e70: 72 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rray)..*/.static
3e80: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
3e90: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71  teColumnNames(sq
3ea0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
3eb0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
3ec0: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
3ed0: 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ol;.  assert( pT
3ee0: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
3ef0: 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d   (pCol = pTable-
3f00: 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20  >aCol)!=0 ){.   
3f10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
3f20: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
3f30: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  Col++){.      sq
3f40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3f50: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
3f60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3f70: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
3f80: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  pDflt);.      sq
3f90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3fa0: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20  pCol->zDflt);.  
3fb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3fc0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70  e(db, pCol->zTyp
3fd0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
3fe0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
3ff0: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
4000: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4010: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43  e(db, pTable->aC
4020: 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ol);.  }.}../*.*
4030: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
4040: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
4050: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
4060: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
4070: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
4080: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
4090: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
40a0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
40b0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
40c0: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
40d0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
40e0: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
40f0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
4100: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
4110: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
4120: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
4130: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
4140: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
4150: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4160: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
4170: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
4180: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
4190: 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69  e db parameter i
41a0: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20  s optional.  It 
41b0: 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  is needed if the
41c0: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a   Table object .*
41d0: 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61  * contains looka
41e0: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54  side memory.  (T
41f0: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20  able objects in 
4200: 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f  the schema do no
4210: 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69  t use.** lookasi
4220: 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73  de memory, but s
4230: 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61  ome ephemeral Ta
4240: 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29  ble objects do.)
4250: 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70    Or the.** db p
4260: 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20  arameter can be 
4270: 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e  used with db->pn
4280: 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65  BytesFreed to me
4290: 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  asure the memory
42a0: 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20  .** used by the 
42b0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Table object..*/
42c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
42d0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
42e0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
42f0: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
4300: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
4310: 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e   TESTONLY( int n
4320: 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20  Lookaside; ) /* 
4330: 55 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c  Used to verify l
4340: 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65  ookaside not use
4350: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a  d for schema */.
4360: 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61 62  .  assert( !pTab
4370: 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e 52  le || pTable->nR
4380: 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f  ef>0 );..  /* Do
4390: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
43a0: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
43b0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
43c0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
43d0: 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29  .  if( !pTable )
43e0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
43f0: 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  (!db || db->pnBy
4400: 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20  tesFreed==0) && 
4410: 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29  (--pTable->nRef)
4420: 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  >0) ) return;.. 
4430: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
4440: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
4450: 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61  ding lookaside a
4460: 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73 63  llocations in sc
4470: 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a  hema Tables.  **
4480: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
4490: 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72 61  any free() opera
44a0: 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73 63  tions.  Since sc
44b0: 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20 6e  hema Tables do n
44c0: 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b  ot use.  ** look
44d0: 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d 62  aside, this numb
44e0: 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68  er should not ch
44f0: 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f  ange. */.  TESTO
4500: 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20  NLY( nLookaside 
4510: 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c 65  = (db && (pTable
4520: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
4530: 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f  Ephemeral)==0) ?
4540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4550: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f            db->lo
4560: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30  okaside.nOut : 0
4570: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
4580: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4590: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
45a0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
45b0: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
45c0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
45d0: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
45e0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
45f0: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4600: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4610: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
4620: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
4630: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
4640: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
4650: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
4660: 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a  Name = pIndex->z
4670: 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53  Name; .      TES
4680: 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70  TONLY ( Index *p
4690: 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48  Old = ) sqlite3H
46a0: 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20  ashInsert(.     
46b0: 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63      &pIndex->pSc
46c0: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
46d0: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
46e0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30 0a  len30(zName), 0.
46f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4700: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4710: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4720: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4730: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4740: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4750: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4760: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4770: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4780: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4790: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
47a0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
47b0: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
47c0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
47d0: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
47e0: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
47f0: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4800: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4810: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65  .  */.  sqliteDe
4820: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4830: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73  db, pTable);.  s
4840: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4850: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
4860: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4870: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
4880: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
4890: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
48a0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
48b0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
48c0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73  E_OMIT_CHECK.  s
48d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
48e0: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  lete(db, pTable-
48f0: 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66  >pCheck);.#endif
4900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4910: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4920: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
4930: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
4940: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
4950: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4960: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
4970: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
4980: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
4990: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
49a0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
49b0: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
49c0: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
49d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
49e0: 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ut );.}../*.** U
49f0: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
4a00: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
4a10: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
4a20: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
4a30: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
4a40: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
4a50: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
4a60: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
4a70: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
4a80: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
4a90: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
4aa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
4ab0: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
4ac0: 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a   *p;.  Db *pDb;.
4ad0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
4ae0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
4af0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
4b00: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
4b10: 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61   zTabName );.  a
4b20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
4b30: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4b40: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74  , iDb, 0) );.  t
4b50: 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d  estcase( zTabNam
4b60: 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a  e[0]==0 );  /* Z
4b70: 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65  ero-length table
4b80: 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77   names are allow
4b90: 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  ed */.  pDb = &d
4ba0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
4bb0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
4bc0: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4bd0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  ma->tblHash, zTa
4be0: 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  bName,.         
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4c00: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4c10: 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73  TabName),0);.  s
4c20: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
4c30: 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e  e(db, p);.  db->
4c40: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
4c50: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
4c60: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
4c70: 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20  token, return a 
4c80: 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73  string that cons
4c90: 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74  ists of the text
4ca0: 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65   of that.** toke
4cb0: 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
4cc0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
4cd0: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61  tring.** is obta
4ce0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4cf0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
4d00: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
4d10: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
4d20: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ction..**.** Any
4d30: 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73   quotation marks
4d40: 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27   (ex:  "name", '
4d50: 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f  name', [name], o
4d60: 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a  r `name`) that.*
4d70: 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62  * surround the b
4d80: 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  ody of the token
4d90: 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a   are removed..**
4da0: 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f  .** Tokens are o
4db0: 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65  ften just pointe
4dc0: 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  rs into the orig
4dd0: 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e  inal SQL text an
4de0: 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  d so.** are not 
4df0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
4e00: 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73  and are not pers
4e10: 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74  istent.  The ret
4e20: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
4e30: 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  is \000 terminat
4e40: 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73  ed and is persis
4e50: 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tent..*/.char *s
4e60: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4e70: 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ken(sqlite3 *db,
4e80: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
4e90: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
4ea0: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
4eb0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
4ec0: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
4ed0: 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20  char*)pName->z, 
4ee0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  pName->n);.    s
4ef0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
4f00: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
4f10: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
4f20: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
4f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
4f40: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
4f50: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
4f60: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
4f70: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
4f80: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
4f90: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
4fa0: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
4fb0: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
4fc0: 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a  terTable(Parse *
4fd0: 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  p, int iDb){.  V
4fe0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
4ff0: 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71  GetVdbe(p);.  sq
5000: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
5010: 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f  , iDb, MASTER_RO
5020: 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41  OT, 1, SCHEMA_TA
5030: 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c  BLE(iDb));.  sql
5040: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5050: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
5060: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
5070: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
5080: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
5090: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
50a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
50b0: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
50c0: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
50d0: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
50e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
50f0: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5100: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5110: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5120: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5130: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5140: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5150: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
5160: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5170: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
5180: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
5190: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
51a0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
51b0: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
51c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
51d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
51e0: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
51f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5200: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5210: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5220: 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20  b *pDb;.    int 
5230: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
5240: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
5250: 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31  for(i=(db->nDb-1
5260: 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b  ), pDb=&db->aDb[
5270: 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  i]; i>=0; i--, p
5280: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Db--){.      if(
5290: 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c   (!OMIT_TEMPDB |
52a0: 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73  | i!=1 ) && n==s
52b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
52c0: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20  Db->zName) && . 
52d0: 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
52e0: 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e  te3StrICmp(pDb->
52f0: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  zName, zName) ){
5300: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5320: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
5330: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
5340: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
5350: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
5360: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
5370: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
5380: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
5390: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
53a0: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
53b0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
53c0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
53d0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
53e0: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
53f0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5400: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
5410: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
5420: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
5430: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
5440: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  me){.  int i;   
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5470: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
5480: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
54b0: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
54c0: 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65  g for */.  zName
54d0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
54e0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
54f0: 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65  e);.  i = sqlite
5500: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
5510: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
5520: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
5530: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  e);.  return i;.
5540: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
5550: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
5560: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
5570: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
5580: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
5590: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
55a0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
55b0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
55c0: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
55d0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
55e0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
55f0: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
5600: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5610: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
5620: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
5630: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
5640: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
5650: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
5660: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
5670: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
5680: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
5690: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
56a0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
56b0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
56c0: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
56d0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
56e0: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
56f0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5700: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5710: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
5720: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
5730: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
5740: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
5750: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5760: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
5770: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
5780: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
5790: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
57a0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
57b0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
57c0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
57d0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
57e0: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
57f0: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
5800: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
5810: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
5820: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
5830: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
5840: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
5850: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
5860: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
5870: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
5880: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
5890: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
58a0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
58b0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
58c0: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
58d0: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
58e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
58f0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41  >db;..  if( ALWA
5900: 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26  YS(pName2!=0) &&
5910: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
5920: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
5930: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
5940: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5950: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
5960: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
5970: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5980: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
5990: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  -1;.    }.    *p
59a0: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
59b0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
59c0: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
59d0: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
59e0: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
59f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5a00: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
5a10: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
5a20: 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  e1);.      pPars
5a30: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5a40: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5a50: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
5a60: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
5a70: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
5a80: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
5a90: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
5aa0: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
5ab0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
5ac0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
5ad0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5ae0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
5af0: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
5b00: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
5b10: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
5b20: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
5b30: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
5b40: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
5b50: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
5b60: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
5b70: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
5b80: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
5b90: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
5ba0: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
5bb0: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
5bc0: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
5bd0: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
5be0: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
5bf0: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
5c00: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
5c10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
5c20: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
5c30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
5c40: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
5c50: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
5c60: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
5c70: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
5c80: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
5c90: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
5ca0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
5cb0: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
5cc0: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
5cd0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
5ce0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
5cf0: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
5d00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5d10: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
5d20: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
5d30: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
5d40: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
5d50: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
5d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5d70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5d80: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
5d90: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
5da0: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
5db0: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
5dc0: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
5dd0: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
5de0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
5df0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
5e00: 2d 3e 61 75 74 6f 49 6e 64 65 78 21 3d 32 3b 20  ->autoIndex!=2; 
5e10: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
5e20: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
5e30: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
5e40: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
5e50: 64 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  dx that correspo
5e60: 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20  nds to table.** 
5e70: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65  column iCol.  Re
5e80: 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66  turn -1 if not f
5e90: 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c  ound..*/.i16 sql
5ea0: 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
5eb0: 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  x(Index *pIdx, i
5ec0: 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  16 iCol){.  int 
5ed0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5ee0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
5ef0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f  ++){.    if( iCo
5f00: 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  l==pIdx->aiColum
5f10: 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b  n[i] ) return i;
5f20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
5f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
5f40: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
5f50: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
5f60: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
5f70: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
5f80: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
5f90: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
5fa0: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
5fb0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
5fc0: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
5fd0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5fe0: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
5ff0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6000: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
6010: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
6020: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
6030: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
6040: 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65  e name. The isTe
6050: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
6060: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
6070: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
6080: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
6090: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
60a0: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
60b0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
60c0: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
60d0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
60e0: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
60f0: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
6100: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
6110: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
6120: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
6130: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
6140: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
6150: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
6160: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
6170: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
6180: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
6190: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
61a0: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
61b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
61c0: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
61d0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
61e0: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
61f0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
6200: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
6210: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
6220: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6230: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
6240: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
6250: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
6260: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
6270: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
6280: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6290: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
62a0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
62b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
62c0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
62d0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
62e0: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
62f0: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
6300: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6310: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
6320: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
6330: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
6340: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6350: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
6360: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
6370: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6380: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
6390: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
63a0: 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72  View,      /* Tr
63b0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
63c0: 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73  VIEW */.  int is
63d0: 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72  Virtual,   /* Tr
63e0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
63f0: 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f  VIRTUAL table */
6400: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
6410: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
6420: 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61  g if table alrea
6430: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
6440: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
6450: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
6460: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
6470: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
6480: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6490: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
64a0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
64b0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
64c0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
64d0: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
64e0: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
64f0: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
6500: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
6510: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
6520: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
6530: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
6540: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
6550: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
6560: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
6570: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
6580: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
6590: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
65a0: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
65b0: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
65c0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
65d0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
65e0: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
65f0: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
6600: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
6610: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
6620: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
6630: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
6640: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
6650: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
6660: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
6670: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
6680: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
6690: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
66a0: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
66b0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
66c0: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
66d0: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
66e0: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
66f0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
6700: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
6710: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
6720: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
6730: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
6740: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
6750: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
6760: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
6770: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
6780: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
6790: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
67a0: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
67b0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
67c0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
67d0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
67e0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
67f0: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
6800: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6810: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6820: 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d 65   isTemp && pName
6830: 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d 31  2->n>0 && iDb!=1
6840: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
6850: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
6860: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
6870: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
6880: 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20 20  ed. Unless .    
6890: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
68a0: 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61  name is "temp" a
68b0: 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 73  nyway.  */.    s
68c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
68d0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
68e0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
68f0: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
6900: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
6910: 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f    }.  if( !OMIT_
6920: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6930: 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70   ) iDb = 1;..  p
6940: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
6950: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e  n = *pName;.  zN
6960: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
6970: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
6980: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
6990: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
69a0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
69b0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
69c0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
69d0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
69e0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
69f0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
6a00: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
6a10: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
6a20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6a30: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
6a40: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
6a50: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
6a60: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  ;.  {.    int co
6a70: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  de;.    char *zD
6a80: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
6a90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
6aa0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
6ab0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
6ac0: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
6ad0: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
6ae0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
6af0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6b00: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
6b10: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
6b20: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
6b30: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
6b40: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
6b50: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6b60: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
6b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6b80: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6b90: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
6ba0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6bb0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
6bc0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
6bd0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6be0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6bf0: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
6c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6c10: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6c20: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
6c30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
6c40: 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20  ( !isVirtual && 
6c50: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
6c60: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a  (pParse, code, z
6c70: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
6c80: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6c90: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6ca0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
6cb0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
6cc0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
6cd0: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
6ce0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
6cf0: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
6d00: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
6d10: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
6d20: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
6d30: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
6d40: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65   ** it does. The
6d50: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
6d60: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62   the statement b
6d70: 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20  eing parsed was 
6d80: 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61  passed.  ** to a
6d90: 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  n sqlite3_declar
6da0: 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49  e_vtab() call. I
6db0: 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79  n that case only
6dc0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
6dd0: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73  s.  ** and types
6de0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73   will be used, s
6df0: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  o there is no ne
6e00: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e  ed to test for n
6e10: 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f  amespace.  ** co
6e20: 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  llisions..  */. 
6e30: 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45   if( !IN_DECLARE
6e40: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 63 68 61  _VTAB ){.    cha
6e50: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
6e60: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
6e70: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
6e80: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
6e90: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
6ea0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6eb0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
6ec0: 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71  .    pTable = sq
6ed0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
6ee0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  b, zName, zDb);.
6ef0: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
6f00: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45  {.      if( !noE
6f10: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
6f20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6f30: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
6f40: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
6f50: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   pName);.      }
6f60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
6f70: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
6f80: 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20  busy );.        
6f90: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
6fa0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
6fb0: 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
6fc0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6fd0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
6fe0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
6ff0: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
7000: 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b  Name, zDb)!=0 ){
7010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
7020: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7030: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
7040: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
7050: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
7060: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7070: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7080: 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d  .  }..  pTable =
7090: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
70a0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
70b0: 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
70c0: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
70d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
70e0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65   = 1;.    pParse
70f0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
7100: 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  MEM;.    pParse-
7110: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
7120: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7130: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
7140: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
7150: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
7160: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
7170: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
7180: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
7190: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  ;.  pTable->nRef
71a0: 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 1;.  pTable->
71b0: 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37  nRowEst = 104857
71c0: 36 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  6;.  assert( pPa
71d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
71e0: 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  0 );.  pParse->p
71f0: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
7200: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
7210: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
7220: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
7230: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
7240: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
7250: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
7260: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
7270: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
7280: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
7290: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
72a0: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
72b0: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
72c0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
72d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
72e0: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NCREMENT.  if( !
72f0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
7300: 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  & strcmp(zName, 
7310: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
7320: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ")==0 ){.    ass
7330: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
7340: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
7350: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
7360: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
7370: 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65  pSeqTab = pTable
7380: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
7390: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
73a0: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
73b0: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
73c0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
73d0: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
73e0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
73f0: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
7400: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
7410: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
7420: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
7430: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
7440: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
7450: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
7460: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
7470: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
7480: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
7490: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
74a0: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
74b0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
74c0: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
74d0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
74e0: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
74f0: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
7500: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
7510: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
7520: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
7530: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
7540: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
7550: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
7560: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
7570: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
7580: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
7590: 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65  j1;.    int file
75a0: 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20  Format;.    int 
75b0: 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33  reg1, reg2, reg3
75c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
75d0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
75e0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
75f0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
7600: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7610: 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69  BLE.    if( isVi
7620: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
7630: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7640: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
7650: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
7660: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
7670: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
7680: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
7690: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
76a0: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
76b0: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
76c0: 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20    */.    reg1 = 
76d0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
76e0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
76f0: 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50  m;.    reg2 = pP
7700: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20  arse->regRoot = 
7710: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7720: 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61      reg3 = ++pPa
7730: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
7740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7750: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
7760: 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54  e, iDb, reg3, BT
7770: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29  REE_FILE_FORMAT)
7780: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7790: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
77a0: 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  b);.    j1 = sql
77b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
77c0: 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a  , OP_If, reg3);.
77d0: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
77e0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
77f0: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
7800: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
7810: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
7820: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
7830: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
7840: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7850: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65  OP_Integer, file
7860: 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20  Format, reg3);. 
7870: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7880: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
7890: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
78a0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65  _FILE_FORMAT, re
78b0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
78c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
78d0: 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62  _Integer, ENC(db
78e0: 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  ), reg3);.    sq
78f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7900: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
7910: 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54   iDb, BTREE_TEXT
7920: 5f 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29  _ENCODING, reg3)
7930: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7940: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
7950: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a  ;..    /* This j
7960: 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c  ust creates a pl
7970: 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72  ace-holder recor
7980: 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  d in the sqlite_
7990: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
79a0: 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20    ** The record 
79b0: 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74  created does not
79c0: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e   contain anythin
79d0: 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20  g yet.  It will 
79e0: 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20  be replaced.    
79f0: 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65  ** by the real e
7a00: 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e  ntry in code gen
7a10: 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65  erated at sqlite
7a20: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20  3EndTable()..   
7a30: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
7a40: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77  owid for the new
7a50: 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69   entry is left i
7a60: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
7a70: 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20  e->regRowid..   
7a80: 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   ** The root pag
7a90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
7aa0: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66  new table is lef
7ab0: 74 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d  t in reg pParse-
7ac0: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
7ad0: 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72   The rowid and r
7ae0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
7af0: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65  values are neede
7b00: 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  d by the code th
7b10: 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  at.    ** sqlite
7b20: 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67  3EndTable will g
7b30: 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a  enerate..    */.
7b40: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
7b50: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
7b60: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
7b70: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7b80: 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56  BLE).    if( isV
7b90: 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c  iew || isVirtual
7ba0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7bb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7bc0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
7bd0: 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g2);.    }else.#
7be0: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
7bf0: 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72    pParse->addrCr
7c00: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Tab = sqlite3Vdb
7c10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72  eAddOp2(v, OP_Cr
7c20: 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20  eateTable, iDb, 
7c30: 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  reg2);.    }.   
7c40: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
7c50: 65 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  erTable(pParse, 
7c60: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
7c70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7c80: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72  P_NewRowid, 0, r
7c90: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
7ca0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7cb0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29  P_Null, 0, reg3)
7cc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7cd0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7ce0: 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72  sert, 0, reg3, r
7cf0: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
7d00: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
7d10: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
7d20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7d30: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp0(v, OP_Clo
7d40: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  se);.  }..  /* N
7d50: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
7d60: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
7d70: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
7d80: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
7d90: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
7da0: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
7db0: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
7dc0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
7dd0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
7de0: 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  ** This macro is
7df0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
7e00: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20   two strings in 
7e10: 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  a case-insensiti
7e20: 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74  ve manner..** It
7e30: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73   is slightly fas
7e40: 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67  ter than calling
7e50: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7e60: 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a  ) directly, but.
7e70: 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67  ** produces larg
7e80: 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57  er code..**.** W
7e90: 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63  ARNING: This mac
7ea0: 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74  ro is not compat
7eb0: 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 74  ible with the st
7ec0: 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49  rcmp() family. I
7ed0: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75  t.** returns tru
7ee0: 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74 72  e if the two str
7ef0: 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20  ings are equal, 
7f00: 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e  otherwise false.
7f10: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49  .*/.#define STRI
7f20: 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c  CMP(x, y) (\.sql
7f30: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
7f40: 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [*(unsigned char
7f50: 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71   *)(x)]==   \.sq
7f60: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
7f70: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
7f80: 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26  r *)(y)]     \.&
7f90: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
7fa0: 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30  ((x)+1,(y)+1)==0
7fb0: 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20   )../*.** Add a 
7fc0: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
7fd0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
7fe0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
7ff0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
8000: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
8010: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
8020: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
8030: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
8040: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8050: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
8060: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
8070: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
8080: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
8090: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
80a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
80b0: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
80c0: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
80d0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
80e0: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
80f0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
8100: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
8110: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
8120: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
8130: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8140: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
8150: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
8160: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
8170: 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49  return;.#if SQLI
8180: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
8190: 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62  if( p->nCol+1>db
81a0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
81b0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
81c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
81d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
81e0: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f  o many columns o
81f0: 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  n %s", p->zName)
8200: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8210: 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73  }.#endif.  z = s
8220: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
8230: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
8240: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
8250: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
8260: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
8270: 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d 50  .    if( STRICMP
8280: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
8290: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
82a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
82b0: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
82c0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
82d0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
82e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
82f0: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
8300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8310: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
8320: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
8330: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
8340: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
8350: 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c  alloc(db,p->aCol
8360: 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a  ,(p->nCol+8)*siz
8370: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
8380: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
8390: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
83a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
83b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
83c0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c     }.    p->aCol
83d0: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
83e0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
83f0: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
8400: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
8410: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
8420: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
8430: 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65  z;. .  /* If the
8440: 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70  re is no type sp
8450: 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73  ecified, columns
8460: 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c   have the defaul
8470: 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20  t affinity.  ** 
8480: 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65  'NONE'. If there
8490: 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69   is a type speci
84a0: 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74  fied, then sqlit
84b0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
84c0: 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63  ) will.  ** be c
84d0: 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65  alled next to se
84e0: 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  t pCol->affinity
84f0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
8500: 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  .  pCol->affinit
8510: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
8520: 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45  ONE;.  pCol->szE
8530: 73 74 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f  st = 1;.  p->nCo
8540: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
8550: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8560: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
8570: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8580: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8590: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
85a0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
85b0: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
85c0: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
85d0: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
85e0: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
85f0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
8600: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
8610: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
8620: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
8630: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
8640: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
8650: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
8660: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
8670: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20    Table *p;.  p 
8680: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8690: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
86a0: 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c  || NEVER(p->nCol
86b0: 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <1) ) return;.  
86c0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
86d0: 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38  1].notNull = (u8
86e0: 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  )onError;.}../*.
86f0: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
8700: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
8710: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
8720: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
8730: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
8740: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a  ffinity type..**
8750: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8760: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64   does a case-ind
8770: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20  ependent search 
8780: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  of zType for the
8790: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20   .** substrings 
87a0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
87b0: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f   table. If one o
87c0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
87d0: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
87e0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
87f0: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75  affinity is retu
8800: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63  rned. If zType c
8810: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20  ontains.** more 
8820: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  than one of the 
8830: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72  substrings, entr
8840: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74  ies toward the t
8850: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61  op of .** the ta
8860: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74  ble take priorit
8870: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
8880: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f  if zType is 'BLO
8890: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54  BINT', .** SQLIT
88a0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73  E_AFF_INTEGER is
88b0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
88c0: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c   Substring     |
88d0: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d   Affinity.** ---
88e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
8900: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c   'INT'         |
8910: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
8920: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20  GER.** 'CHAR'   
8930: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8940: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27  F_TEXT.** 'CLOB'
8950: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8960: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45  _AFF_TEXT.** 'TE
8970: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  XT'        | SQL
8980: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
8990: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'BLOB'        | 
89a0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
89b0: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20  ** 'REAL'       
89c0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
89d0: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20  AL.** 'FLOA'    
89e0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
89f0: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20  _REAL.** 'DOUB' 
8a00: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8a10: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49  AFF_REAL.**.** I
8a20: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
8a30: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
8a40: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
8a50: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
8a60: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
8a70: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
8a80: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
8a90: 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  yType(const char
8aa0: 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73   *zIn, u8 *pszEs
8ab0: 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b  t){.  u32 h = 0;
8ac0: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51  .  char aff = SQ
8ad0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8ae0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
8af0: 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66  zChar = 0;..  if
8b00: 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72  ( zIn==0 ) retur
8b10: 6e 20 61 66 66 3b 0a 20 20 77 68 69 6c 65 28 20  n aff;.  while( 
8b20: 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20  zIn[0] ){.    h 
8b30: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
8b40: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28  e3UpperToLower[(
8b50: 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20  *zIn)&0xff];.   
8b60: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
8b70: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
8b80: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
8b90: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
8ba0: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
8bb0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8bc0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
8bd0: 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a     zChar = zIn;.
8be0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8bf0: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
8c00: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
8c10: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
8c20: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
8c30: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
8c40: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
8c50: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
8c60: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
8c70: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
8c80: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
8c90: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8ca0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
8cb0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
8cc0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
8cd0: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
8ce0: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
8cf0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
8d00: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
8d10: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
8d20: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
8d30: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8d40: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
8d50: 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d       if( zIn[0]=
8d60: 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a  ='(' ) zChar = z
8d70: 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  In;.#ifndef SQLI
8d80: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
8d90: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
8da0: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
8db0: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
8dc0: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
8dd0: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
8de0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
8df0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8e00: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
8e10: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8e20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8e30: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
8e40: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8e50: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
8e60: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
8e70: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8e80: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8e90: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8ea0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
8eb0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8ec0: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
8ed0: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
8ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
8ef0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
8f00: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8f10: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
8f20: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8f30: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
8f40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
8f50: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
8f60: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
8f70: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
8f80: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
8f90: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
8fa0: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
8fb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
8fc0: 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69 73 20  /* If pszEst is 
8fd0: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20  not NULL, store 
8fe0: 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
8ff0: 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20  he field size.  
9000: 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74  The.  ** estimat
9010: 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74  e is scaled so t
9020: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
9030: 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e  an integer is 1.
9040: 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45 73    */.  if( pszEs
9050: 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74  t ){.    *pszEst
9060: 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66 61 75   = 1;   /* defau
9070: 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f  lt size is appro
9080: 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20  x 4 bytes */.   
9090: 20 69 66 28 20 61 66 66 3c 3d 53 51 4c 49 54 45   if( aff<=SQLITE
90a0: 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
90b0: 20 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a     if( zChar ){.
90c0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
90d0: 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  Char[0] ){.     
90e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
90f0: 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d  Isdigit(zChar[0]
9100: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
9110: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20 20   int v = 0;.    
9120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
9130: 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26  etInt32(zChar, &
9140: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
9150: 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20  v = v/4 + 1;.   
9160: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 32           if( v>2
9170: 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20  55 ) v = 255;.  
9180: 20 20 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73            *pszEs
9190: 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b  t = v; /* BLOB(k
91a0: 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43  ), VARCHAR(k), C
91b0: 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34  HAR(k) -> r=(k/4
91c0: 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  +1) */.         
91d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
91e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
91f0: 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20  zChar++;.       
9200: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
9210: 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20          *pszEst 
9220: 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20  = 5;   /* BLOB, 
9230: 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d  TEXT, CLOB -> r=
9240: 35 20 20 28 61 70 70 72 6f 78 20 32 30 20 62 79  5  (approx 20 by
9250: 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  tes)*/.      }. 
9260: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9270: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
9280: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9290: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
92a0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
92b0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
92c0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
92d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
92e0: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
92f0: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
9300: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
9310: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
9320: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
9330: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
9340: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
9350: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9360: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
9370: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
9380: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
9390: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
93a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
93b0: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
93c0: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
93d0: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
93e0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
93f0: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
9400: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
9410: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
9420: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
9430: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
9440: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
9450: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
9460: 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d  mn *pCol;..  p =
9470: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9480: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
9490: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
94a0: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
94b0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
94c0: 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73  ->nCol-1];.  ass
94d0: 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  ert( pCol->zType
94e0: 3d 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  ==0 );.  pCol->z
94f0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Type = sqlite3Na
9500: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
9510: 73 65 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a  se->db, pType);.
9520: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
9530: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
9540: 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79  tyType(pCol->zTy
9550: 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74  pe, &pCol->szEst
9560: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
9570: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
9580: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
9590: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
95a0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
95b0: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
95c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
95d0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
95e0: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
95f0: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
9600: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
9610: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
9620: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
9630: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
9640: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9650: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9660: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
9670: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
9680: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
9690: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
96a0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
96b0: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
96c0: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
96d0: 70 50 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e  pParse, ExprSpan
96e0: 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c   *pSpan){.  Tabl
96f0: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
9700: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
9710: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9720: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
9730: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
9740: 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f   p!=0 ){.    pCo
9750: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
9760: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
9770: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
9780: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9790: 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72  ion(pSpan->pExpr
97a0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
97b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
97c0: 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75  e, "default valu
97d0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d  e of column [%s]
97e0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
97f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
9800: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
9810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
9820: 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69   copy of pExpr i
9830: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  s used instead o
9840: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20  f the original, 
9850: 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e  as pExpr contain
9860: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e  s.      ** token
9870: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
9880: 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e  volatile memory.
9890: 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74   The 'span' of t
98a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
98b0: 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
98c0: 65 64 20 62 79 20 70 72 61 67 6d 61 20 74 61 62  ed by pragma tab
98d0: 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a  le_info..      *
98e0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
98f0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
9900: 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20  ol->pDflt);.    
9910: 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20    pCol->pDflt = 
9920: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
9930: 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c  b, pSpan->pExpr,
9940: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
9950: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
9960: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
9970: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43  zDflt);.      pC
9980: 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69  ol->zDflt = sqli
9990: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
99a0: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
99b0: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
99e0: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
99f0: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
9a00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
9a10: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
9a20: 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29  b, pSpan->pExpr)
9a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  ;.}../*.** Desig
9a40: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
9a50: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
9a60: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
9a70: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
9a80: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
9a90: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
9aa0: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
9ab0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
9ac0: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
9ad0: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
9ae0: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
9af0: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
9b00: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
9b10: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
9b20: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
9b30: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
9b40: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
9b50: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
9b60: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
9b70: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
9b80: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
9b90: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
9ba0: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
9bb0: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
9bc0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
9bd0: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
9be0: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
9bf0: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
9c00: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
9c10: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
9c20: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
9c30: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
9c40: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
9c50: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
9c60: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
9c70: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
9c80: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
9c90: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
9ca0: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
9cb0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
9cc0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
9cd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
9ce0: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
9cf0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
9d00: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
9d10: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
9d20: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
9d30: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
9d40: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
9d50: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
9d60: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
9d70: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
9d80: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
9d90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9da0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
9db0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
9dc0: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
9dd0: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
9de0: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
9df0: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
9e00: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
9e10: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
9e20: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
9e30: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
9e40: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
9e50: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
9e60: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
9e70: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
9e80: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
9e90: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
9ea0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
9eb0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9ec0: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79  ble;.  char *zTy
9ed0: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  pe = 0;.  int iC
9ee0: 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e  ol = -1, i;.  in
9ef0: 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20 70  t nTerm;.  if( p
9f00: 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  Tab==0 || IN_DEC
9f10: 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
9f20: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
9f30: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
9f40: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
9f50: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
9f60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9f70: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
9f80: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
9f90: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
9fa0: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
9fb0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
9fc0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
9fd0: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
9fe0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
9ff0: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
a000: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
a010: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
a020: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
a030: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
a040: 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol].colFlags |= 
a050: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b  COLFLAG_PRIMKEY;
a060: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
a070: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
a080: 79 70 65 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  ype;.    nTerm =
a090: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
a0a0: 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e   nTerm = pList->
a0b0: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
a0c0: 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
a0d0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
a0e0: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
a0f0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
a100: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
a110: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
a120: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
a130: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
a140: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
a150: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
a160: 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c  iCol].colFlags |
a170: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
a180: 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  Y;.          zTy
a190: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
a1a0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
a1b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a1d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
a1e0: 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 7a  nTerm==1.   && z
a1f0: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
a200: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
a210: 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26  NTEGER")==0.   &
a220: 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  & sortOrder==SQL
a230: 49 54 45 5f 53 4f 5f 41 53 43 0a 20 20 29 7b 0a  ITE_SO_ASC.  ){.
a240: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
a250: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
a260: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29  ->keyConf = (u8)
a270: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  onError;.    ass
a280: 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20  ert( autoInc==0 
a290: 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b  || autoInc==1 );
a2a0: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
a2b0: 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54  ags |= autoInc*T
a2c0: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  F_Autoincrement;
a2d0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
a2e0: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
a2f0: 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61  Order = pList->a
a300: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [0].sortOrder;. 
a310: 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49   }else if( autoI
a320: 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  nc ){.#ifndef SQ
a330: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
a340: 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69  CREMENT.    sqli
a350: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a360: 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45  se, "AUTOINCREME
a370: 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  NT is only allow
a380: 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20  ed on an ".     
a390: 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41    "INTEGER PRIMA
a3a0: 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66  RY KEY");.#endif
a3b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
a3c0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a3d0: 70 56 64 62 65 3b 0a 20 20 20 20 49 6e 64 65 78  pVdbe;.    Index
a3e0: 20 2a 70 3b 0a 20 20 20 20 69 66 28 20 76 20 29   *p;.    if( v )
a3f0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b 69   pParse->addrSki
a400: 70 50 4b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pPK = sqlite3Vdb
a410: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f  eAddOp0(v, OP_No
a420: 6f 70 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  op);.    p = sql
a430: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
a440: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
a450: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
a460: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
a480: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b  , sortOrder, 0);
a490: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
a4a0: 20 20 20 20 70 2d 3e 61 75 74 6f 49 6e 64 65 78      p->autoIndex
a4b0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20   = 2;.      if( 
a4c0: 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  v ) sqlite3VdbeJ
a4d0: 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73  umpHere(v, pPars
a4e0: 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29 3b 0a  e->addrSkipPK);.
a4f0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
a500: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
a510: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
a520: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
a530: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
a540: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
a550: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
a560: 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74   new CHECK const
a570: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62  raint to the tab
a580: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
a590: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
a5a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a5b0: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
a5c0: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
a5d0: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
a5e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
a5f0: 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72  Expr *pCheckExpr
a600: 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65    /* The check e
a610: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
a620: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a630: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c  MIT_CHECK.  Tabl
a640: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
a650: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
a660: 66 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44  f( pTab && !IN_D
a670: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
a680: 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20     pTab->pCheck 
a690: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
a6a0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
a6b0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43  pTab->pCheck, pC
a6c0: 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69  heckExpr);.    i
a6d0: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  f( pParse->const
a6e0: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20  raintName.n ){. 
a6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a700: 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
a710: 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  se, pTab->pCheck
a720: 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  , &pParse->const
a730: 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20  raintName, 1);. 
a740: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
a750: 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
a760: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
a770: 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b  arse->db, pCheck
a780: 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Expr);.  }.}../*
a790: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
a7a0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
a7b0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
a7c0: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
a7d0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
a7e0: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
a7f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a800: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
a810: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
a820: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
a830: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
a840: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  i;.  char *zColl
a850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a860: 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20  * Dequoted name 
a870: 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  of collation seq
a880: 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74  uence */.  sqlit
a890: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
a8a0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
a8b0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
a8c0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
a8d0: 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  l-1;.  db = pPar
a8e0: 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20  se->db;.  zColl 
a8f0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
a900: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
a910: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
a920: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
a930: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
a940: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
a950: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64  Coll) ){.    Ind
a960: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71  ex *pIdx;.    sq
a970: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a980: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
a990: 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69  );.    p->aCol[i
a9a0: 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b  ].zColl = zColl;
a9b0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
a9c0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
a9d0: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
a9e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
a9f0: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20  ATE <type>",.   
aa00: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
aa10: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
aa20: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
aa30: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
aa40: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  e.    ** collati
aa50: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
aa60: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
aa70: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
aa80: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
aa90: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
aaa0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
aab0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
aac0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
aad0: 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  KeyCol==1 );.   
aae0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
aaf0: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20  olumn[0]==i ){. 
ab00: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
ab10: 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c  oll[0] = p->aCol
ab20: 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [i].zColl;.     
ab30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
ab40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
ab50: 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
ab60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
ab70: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
ab80: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
ab90: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
aba0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
abb0: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
abc0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
abd0: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
abe0: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
abf0: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
ac00: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
ac10: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
ac20: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
ac30: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
ac40: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
ac50: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
ac60: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
ac70: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
ac80: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
ac90: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
aca0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
acb0: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
acc0: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
acd0: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
ace0: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
acf0: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
ad00: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
ad10: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
ad20: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
ad30: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
ad40: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
ad50: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
ad60: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
ad70: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
ad80: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
ad90: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
ada0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
adb0: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
adc0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  ** pParse..**.**
add0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
ade0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
adf0: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  d sqlite3FindCol
ae00: 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f  lSeq().  This ro
ae10: 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73  utine.** invokes
ae20: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
ae30: 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61  actory if the na
ae40: 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61  med collation ca
ae50: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a  nnot be found.**
ae60: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61   and generates a
ae70: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
ae80: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
ae90: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
aea0: 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65  Seq(), sqlite3Ge
aeb0: 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f  tCollSeq().*/.Co
aec0: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
aed0: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
aee0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
aef0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
af00: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
af10: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20  Parse->db;.  u8 
af20: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
af30: 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64   u8 initbusy = d
af40: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
af50: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
af60: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
af70: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
af80: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e  , enc, zName, in
af90: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
afa0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
afb0: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
afc0: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
afd0: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
afe0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e  llSeq(pParse, en
aff0: 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  c, pColl, zName)
b000: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
b010: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
b020: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b030: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
b040: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
b050: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
b060: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
b070: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
b080: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
b090: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
b0a0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
b0b0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
b0c0: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
b0d0: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
b0e0: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
b0f0: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
b100: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
b110: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
b120: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
b130: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
b140: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
b150: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
b160: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
b170: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
b180: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
b190: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
b1a0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
b1b0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
b1c0: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
b1d0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
b1e0: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
b1f0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
b200: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
b210: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
b220: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
b230: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
b240: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
b250: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
b260: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
b270: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
b280: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
b290: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
b2a0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
b2b0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
b2c0: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
b2d0: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
b2e0: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
b2f0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
b300: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
b310: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
b320: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
b330: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
b340: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
b350: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b360: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
b370: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
b380: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
b390: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
b3a0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c  iDb, 0) );.  sql
b3b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b3c0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
b3d0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
b3e0: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
b3f0: 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  e+1, r1);.  sqli
b400: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b410: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
b420: 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Db, BTREE_SCHEMA
b430: 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20  _VERSION, r1);. 
b440: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
b450: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
b460: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  1);.}../*.** Mea
b470: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
b480: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
b490: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
b4a0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
b4b0: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
b4c0: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
b4d0: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
b4e0: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
b4f0: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
b500: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
b510: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
b520: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
b530: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
b540: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
b550: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
b560: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
b570: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
b580: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
b590: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
b5a0: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
b5b0: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
b5c0: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
b5d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
b5e0: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 2;.}../*.** Th
b5f0: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
b600: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
b610: 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66  o an output buff
b620: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a  er. The second .
b630: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
b640: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
b650: 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e  integer that con
b660: 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74  tains the offset
b670: 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20   at.** which to 
b680: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f  write into the o
b690: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
b6a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69  is function copi
b6b0: 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65  es the.** nul-te
b6c0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
b6d0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
b6e0: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
b6f0: 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c  r, zSignedIdent,
b700: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69  .** to the speci
b710: 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74  fied offset in t
b720: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70  he buffer and up
b730: 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72  dates *pIdx to r
b740: 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  efer.** to the f
b750: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
b760: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72  the last byte wr
b770: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74  itten before ret
b780: 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49  urning..** .** I
b790: 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69  f the string zSi
b7a0: 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73  gnedIdent consis
b7b0: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61  ts entirely of a
b7c0: 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20  lpha-numeric.** 
b7d0: 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73  characters, does
b7e0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
b7f0: 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e  a digit and is n
b800: 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72  ot an SQL keywor
b810: 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
b820: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f   copied to the o
b830: 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61  utput buffer exa
b840: 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f  ctly as it is. O
b850: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
b860: 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  is quoted using 
b870: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a  double-quotes..*
b880: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
b890: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
b8a0: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
b8b0: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
b8c0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b8d0: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
b8e0: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
b8f0: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
b900: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
b910: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66   i = *pIdx;..  f
b920: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
b930: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
b940: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
b950: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
b960: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
b970: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
b980: 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  dQuote = sqlite3
b990: 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  Isdigit(zIdent[0
b9a0: 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79  ]) || sqlite3Key
b9b0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
b9c0: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
b9d0: 28 20 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a  ( !needQuote ){.
b9e0: 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20      needQuote = 
b9f0: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a  zIdent[j];.  }..
ba00: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
ba10: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
ba20: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
ba30: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
ba40: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
ba50: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
ba60: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
ba70: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
ba80: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
ba90: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
baa0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
bab0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
bac0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
bad0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
bae0: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
baf0: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
bb00: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
bb10: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
bb20: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
bb30: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
bb40: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
bb50: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
bb60: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
bb70: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
bb80: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
bb90: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
bba0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
bbb0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
bbc0: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
bbd0: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
bbe0: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
bbf0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
bc00: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
bc10: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
bc20: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
bc30: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
bc40: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
bc50: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
bc60: 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d   + 5;.  }.  n +=
bc70: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
bc80: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
bc90: 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20  50 ){ .    zSep 
bca0: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
bcb0: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
bcc0: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
bcd0: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
bce0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
bcf0: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
bd00: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
bd10: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
bd20: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
bd30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
bd40: 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a  w(0, n);.  if( z
bd50: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  Stmt==0 ){.    d
bd60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
bd70: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
bd80: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
bd90: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
bda0: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
bdb0: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
bdc0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
bdd0: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
bde0: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
bdf0: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
be00: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
be10: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
be20: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
be30: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
be40: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
be50: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
be60: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
be70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
be80: 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a      */ " TEXT",.
be90: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
bea0: 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f  E_AFF_NONE    */
beb0: 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20   "",.        /* 
bec0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
bed0: 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20  IC */ " NUM",.  
bee0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
bef0: 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22  AFF_INTEGER */ "
bf00: 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f   INT",.        /
bf10: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  * SQLITE_AFF_REA
bf20: 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a  L    */ " REAL".
bf30: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c      };.    int l
bf40: 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
bf50: 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20  ar *zType;..    
bf60: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
bf70: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
bf80: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
bf90: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
bfa0: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
bfb0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
bfc0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
bfd0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
bfe0: 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  me);.    assert(
bff0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
c000: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
c010: 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
c020: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
c030: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  ty-SQLITE_AFF_TE
c040: 58 54 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  XT < ArraySize(a
c050: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65  zType) );.    te
c060: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c070: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c080: 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74  FF_TEXT );.    t
c090: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c0a0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c0b0: 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20  AFF_NONE );.    
c0c0: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
c0d0: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
c0e0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
c0f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
c100: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c110: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
c120: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c130: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c140: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
c150: 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54  L );.    .    zT
c160: 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f  ype = azType[pCo
c170: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51  l->affinity - SQ
c180: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a  LITE_AFF_TEXT];.
c190: 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65      len = sqlite
c1a0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
c1b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
c1c0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c1d0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20  LITE_AFF_NONE . 
c1e0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
c1f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71  ol->affinity==sq
c200: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
c210: 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20  e(zType, 0) );. 
c220: 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74     memcpy(&zStmt
c230: 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29  [k], zType, len)
c240: 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a  ;.    k += len;.
c250: 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e      assert( k<=n
c260: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
c270: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
c280: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c  &zStmt[k], "%s",
c290: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
c2a0: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
c2b0: 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78   Resize an Index
c2c0: 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20   object to hold 
c2d0: 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e  N columns total.
c2e0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
c2f0: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
c300: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   and SQLITE_NOME
c310: 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  M on an OOM erro
c320: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
c330: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
c340: 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
c350: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
c360: 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78   N){.  char *zEx
c370: 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  tra;.  int nByte
c380: 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43  ;.  if( pIdx->nC
c390: 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72  olumn>=N ) retur
c3a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
c3b0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52  ssert( pIdx->isR
c3c0: 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  esized==0 );.  n
c3d0: 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63  Byte = (sizeof(c
c3e0: 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69  har*) + sizeof(i
c3f0: 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45  16) + 1)*N;.  zE
c400: 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62  xtra = sqlite3Db
c410: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
c420: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78  Byte);.  if( zEx
c430: 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tra==0 ) return 
c440: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c450: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
c460: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a  Idx->azColl, siz
c470: 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d  eof(char*)*pIdx-
c480: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
c490: 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
c4a0: 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45  r**)zExtra;.  zE
c4b0: 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63  xtra += sizeof(c
c4c0: 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70  har*)*N;.  memcp
c4d0: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
c4e0: 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66  aiColumn, sizeof
c4f0: 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c  (i16)*pIdx->nCol
c500: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69  umn);.  pIdx->ai
c510: 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a  Column = (i16*)z
c520: 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
c530: 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e  += sizeof(i16)*N
c540: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
c550: 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  a, pIdx->aSortOr
c560: 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  der, pIdx->nColu
c570: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f  mn);.  pIdx->aSo
c580: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a  rtOrder = (u8*)z
c590: 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e  Extra;.  pIdx->n
c5a0: 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49  Column = N;.  pI
c5b0: 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20  dx->isResized = 
c5c0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
c5d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c5e0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74  Estimate the tot
c5f0: 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72  al row width for
c600: 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61   a table..*/.sta
c610: 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74  tic void estimat
c620: 65 54 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c  eTableWidth(Tabl
c630: 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69  e *pTab){.  unsi
c640: 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b  gned wTable = 0;
c650: 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20  .  const Column 
c660: 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20  *pTabCol;.  int 
c670: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d  i;.  for(i=pTab-
c680: 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70  >nCol, pTabCol=p
c690: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20  Tab->aCol; i>0; 
c6a0: 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b  i--, pTabCol++){
c6b0: 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70  .    wTable += p
c6c0: 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20  TabCol->szEst;. 
c6d0: 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69   }.  if( pTab->i
c6e0: 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b  PKey<0 ) wTable+
c6f0: 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62  +;.  pTab->szTab
c700: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
c710: 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d  Est(wTable*4);.}
c720: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
c730: 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69 7a   the average siz
c740: 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61  e of a row for a
c750: 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  n index..*/.stat
c760: 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65  ic void estimate
c770: 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65 78  IndexWidth(Index
c780: 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67   *pIdx){.  unsig
c790: 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a  ned wIndex = 0;.
c7a0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
c7b0: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20   Column *aCol = 
c7c0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  pIdx->pTable->aC
c7d0: 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ol;.  for(i=0; i
c7e0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
c7f0: 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20  i++){.    i16 x 
c800: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
c810: 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
c820: 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   x<pIdx->pTable-
c830: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e  >nCol );.    wIn
c840: 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a  dex += x<0 ? 1 :
c850: 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f   aCol[pIdx->aiCo
c860: 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a  lumn[i]].szEst;.
c870: 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64    }.  pIdx->szId
c880: 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  xRow = sqlite3Lo
c890: 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a  gEst(wIndex*4);.
c8a0: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  }../* Return tru
c8b0: 65 20 69 66 20 76 61 6c 75 65 20 78 20 69 73 20  e if value x is 
c8c0: 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  found any of the
c8d0: 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72   first nCol entr
c8e0: 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a  ies of aiCol[].*
c8f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
c900: 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36  Column(const i16
c910: 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f   *aiCol, int nCo
c920: 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69  l, int x){.  whi
c930: 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29  le( nCol-- > 0 )
c940: 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b   if( x==*(aiCol+
c950: 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  +) ) return 1;. 
c960: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
c970: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c980: 20 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64   runs at the end
c990: 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43 52   of parsing a CR
c9a0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
c9b0: 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73  ment that.** has
c9c0: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
c9d0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f   clause.  The jo
c9e0: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
c9f0: 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20  e is to convert 
ca00: 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c  both.** internal
ca10: 20 73 63 68 65 6d 61 20 64 61 74 61 20 73 74 72   schema data str
ca20: 75 63 74 75 72 65 73 20 61 6e 64 20 74 68 65 20  uctures and the 
ca30: 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63  generated VDBE c
ca40: 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 79  ode so that they
ca50: 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69  .** are appropri
ca60: 61 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55  ate for a WITHOU
ca70: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e  T ROWID table in
ca80: 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64  stead of a rowid
ca90: 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67   table..** Chang
caa0: 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  es include:.**.*
cab0: 2a 20 20 20 20 20 28 31 29 20 20 43 6f 6e 76 65  *     (1)  Conve
cac0: 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65  rt the OP_Create
cad0: 54 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50  Table into an OP
cae0: 5f 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20 54  _CreateIndex.  T
caf0: 68 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20 20  here is.**      
cb00: 20 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74 72      no rowid btr
cb10: 65 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  ee for a WITHOUT
cb20: 20 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61 64   ROWID.  Instead
cb30: 2c 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a  , the canonical.
cb40: 2a 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  **          data
cb50: 20 73 74 6f 72 61 67 65 20 69 73 20 61 20 63 6f   storage is a co
cb60: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74 72  vering index btr
cb70: 65 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20  ee..**     (2)  
cb80: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
cb90: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
cba0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
cbb0: 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntry.**         
cbc0: 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59   for the PRIMARY
cbd0: 20 4b 45 59 20 61 73 20 74 68 65 20 74 68 65 20   KEY as the the 
cbe0: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
cbf0: 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20  x is now.**     
cc00: 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20       identified 
cc10: 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  by the sqlite_ma
cc20: 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79  ster table entry
cc30: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74   of the table it
cc40: 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29  self..**     (3)
cc50: 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e    Set the Index.
cc60: 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d  tnum of the PRIM
cc70: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
cc80: 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20  ject in the.**  
cc90: 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74          schema t
cca0: 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  o the rootpage f
ccb0: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62  rom the main tab
ccc0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20  le..**     (4)  
ccd0: 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  Set all columns 
cce0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
ccf0: 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  EY schema object
cd00: 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e   to be NOT NULL.
cd10: 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64  .**     (5)  Add
cd20: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
cd30: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
cd40: 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65  Y KEY Index obje
cd50: 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  ct.**          s
cd60: 6f 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41  o that the PRIMA
cd70: 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65  RY KEY is a cove
cd80: 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65  ring index.  The
cd90: 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20   surplus.**     
cda0: 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65       columns are
cdb0: 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f   part of KeyInfo
cdc0: 2e 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65  .nXField and are
cdd0: 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a   not used for.**
cde0: 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e            sortin
cdf0: 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75  g or lookup or u
ce00: 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73  niqueness checks
ce10: 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65  ..**     (6)  Re
ce20: 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20  place the rowid 
ce30: 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f  tail on all auto
ce40: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
ce50: 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20  ted UNIQUE.**   
ce60: 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77         indices w
ce70: 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20  ith the PRIMARY 
ce80: 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  KEY columns..*/.
ce90: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76  static void conv
cea0: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
ceb0: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
cec0: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
ced0: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  b){.  Index *pId
cee0: 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b  x;.  Index *pPk;
cef0: 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e  .  int nPk;.  in
cf00: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
cf10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
cf20: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
cf30: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a  pParse->pVdbe;..
cf40: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
cf50: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
cf60: 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  opcode that woul
cf70: 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74  d normally creat
cf80: 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d  e the.  ** root-
cf90: 70 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62  page for the tab
cfa0: 6c 65 20 69 6e 74 6f 20 61 20 4f 50 5f 43 72 65  le into a OP_Cre
cfb0: 61 74 65 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e  ateIndex opcode.
cfc0: 20 20 54 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a    The index.  **
cfd0: 20 63 72 65 61 74 65 64 20 77 69 6c 6c 20 62 65   created will be
cfe0: 63 6f 6d 65 20 74 68 65 20 50 52 49 4d 41 52 59  come the PRIMARY
cff0: 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   KEY index..  */
d000: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61  .  if( pParse->a
d010: 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20  ddrCrTab ){.    
d020: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20  assert( v );.   
d030: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
d040: 70 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  p(v, pParse->add
d050: 72 43 72 54 61 62 29 2d 3e 6f 70 63 6f 64 65 20  rCrTab)->opcode 
d060: 3d 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  = OP_CreateIndex
d070: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 79 70 61  ;.  }..  /* Bypa
d080: 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  ss the creation 
d090: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
d0a0: 45 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65  EY btree and the
d0b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
d0c0: 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e   ** table entry.
d0d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
d0e0: 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20 29  se->addrSkipPK )
d0f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20  {.    assert( v 
d100: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d110: 62 65 47 65 74 4f 70 28 76 2c 20 70 50 61 72 73  beGetOp(v, pPars
d120: 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29 2d 3e  e->addrSkipPK)->
d130: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 47 6f 74 6f  opcode = OP_Goto
d140: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
d150: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
d160: 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69  EY index.  Or, i
d170: 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73  f this table was
d180: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
d190: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
d1a0: 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63  ARY KEY table, c
d1b0: 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d  reate a new PRIM
d1c0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a  ARY KEY index. .
d1d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d    */.  if( pTab-
d1e0: 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
d1f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d200: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
d210: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
d220: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
d230: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
d240: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d250: 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e    pList->a[0].zN
d260: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
d270: 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
d280: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2a0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
d2b0: 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
d2c0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c  ].zName);.    pL
d2d0: 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  ist->a[0].sortOr
d2e0: 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50  der = pParse->iP
d2f0: 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  kSortOrder;.    
d300: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
d310: 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20  pNewTable==pTab 
d320: 29 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  );.    pPk = sql
d330: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
d340: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
d350: 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65   pList, pTab->ke
d360: 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20  yConf, 0, 0, 0, 
d370: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 3d  0);.    if( pPk=
d380: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
d390: 20 70 50 6b 2d 3e 61 75 74 6f 49 6e 64 65 78 20   pPk->autoIndex 
d3a0: 3d 20 32 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  = 2;.    pTab->i
d3b0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  PKey = -1;.  }el
d3c0: 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  se{.    pPk = sq
d3d0: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
d3e0: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 0a  ndex(pTab);.  }.
d3f0: 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e    pPk->isCoverin
d400: 67 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  g = 1;.  assert(
d410: 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 6e 50 6b   pPk!=0 );.  nPk
d420: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
d430: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
d440: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
d450: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d460: 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a   is NOT NULL */.
d470: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
d480: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 54 61 62  ; i++){.    pTab
d490: 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f  ->aCol[pPk->aiCo
d4a0: 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c  lumn[i]].notNull
d4b0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d   = 1;.  }.  pPk-
d4c0: 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31  >uniqNotNull = 1
d4d0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  ;..  /* The root
d4e0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52 49   page of the PRI
d4f0: 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65 20  MARY KEY is the 
d500: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20  table root page 
d510: 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d  */.  pPk->tnum =
d520: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20   pTab->tnum;..  
d530: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69 6e  /* Update the in
d540: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
d550: 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e  tation of all UN
d560: 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79 20  IQUE indices by 
d570: 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20  converting.  ** 
d580: 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20  the final rowid 
d590: 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20  column into one 
d5a0: 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
d5b0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
d5c0: 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  EY..  */.  for(p
d5d0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
d5e0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
d5f0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
d600: 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 49  nt n;.    if( pI
d610: 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 3d 3d 32  dx->autoIndex==2
d620: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d630: 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50   for(i=n=0; i<nP
d640: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
d650: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
d660: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
d670: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
d680: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
d690: 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   n++;.    }.    
d6a0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
d6b0: 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
d6c0: 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66  is a superset of
d6d0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
d6e0: 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   */.      pIdx->
d6f0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  nColumn = pIdx->
d700: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63  nKeyCol;.      c
d710: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
d720: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
d730: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64  exObject(db, pId
d740: 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  x, pIdx->nKeyCol
d750: 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  +n) ) return;.  
d760: 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64    for(i=0, j=pId
d770: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50  x->nKeyCol; i<nP
d780: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
d790: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49  f( !hasColumn(pI
d7a0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49  dx->aiColumn, pI
d7b0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b  dx->nKeyCol, pPk
d7c0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
d7d0: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
d7e0: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50  aiColumn[j] = pP
d7f0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  k->aiColumn[i];.
d800: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
d810: 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[j] = pPk->a
d820: 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
d830: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
d840: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
d850: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
d860: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20  pIdx->nKeyCol+n 
d870: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d880: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20  Idx->nColumn>=j 
d890: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
d8a0: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
d8b0: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
d8c0: 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f  Y KEY index.  */
d8d0: 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d  .  if( nPk<pTab-
d8e0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28  >nCol ){.    if(
d8f0: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
d900: 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62  ct(db, pPk, pTab
d910: 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e  ->nCol) ) return
d920: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a  ;.    for(i=0, j
d930: 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  =nPk; i<pTab->nC
d940: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
d950: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
d960: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c  Pk->aiColumn, j,
d970: 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   i) ){.        a
d980: 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43  ssert( j<pPk->nC
d990: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20  olumn );.       
d9a0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
d9b0: 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  ] = i;.        p
d9c0: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  Pk->azColl[j] = 
d9d0: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
d9e0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
d9f0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
da00: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a   pPk->nColumn==j
da10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
da20: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b  pTab->nCol==j );
da30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
da40: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61  k->nColumn = pTa
da50: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a  b->nCol;.  }.}..
da60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
da70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
da80: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
da90: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
daa0: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
dab0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
dac0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
dad0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
dae0: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
daf0: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
db00: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
db10: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
db20: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
db30: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
db40: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
db50: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
db60: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
db70: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
db80: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
db90: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
dba0: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
dbb0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
dbc0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
dbd0: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
dbe0: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
dbf0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
dc00: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
dc10: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
dc20: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
dc30: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
dc40: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
dc50: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
dc60: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
dc70: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
dc80: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
dc90: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
dca0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
dcb0: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
dcc0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
dcd0: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
dce0: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
dcf0: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
dd00: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
dd10: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
dd20: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
dd30: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
dd40: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
dd50: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
dd60: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
dd70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
dd80: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
dd90: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
dda0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
ddb0: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
ddc0: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
ddd0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
dde0: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
ddf0: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
de00: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
de10: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
de20: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
de30: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
de40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
de50: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
de60: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
de70: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
de80: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
de90: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20       /* The ')' 
dea0: 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69  before options i
deb0: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
dec0: 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70  LE */.  u8 tabOp
ded0: 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ts,             
dee0: 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f  /* Extra table o
def0: 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20  ptions. Usually 
df00: 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  0. */.  Select *
df10: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
df20: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
df30: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
df40: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
df50: 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20  Table *p;       
df60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
df70: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
df80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
df90: 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
dfa0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
dfb0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
dfc0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
dfd0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
dfe0: 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62  in which the tab
dff0: 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e  le lives */.  In
e000: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
e010: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d          /* An im
e020: 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74  plied index of t
e030: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  he table */..  i
e040: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
e050: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 64 62  Select==0) || db
e060: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e070: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
e080: 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  }.  p = pParse->
e090: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
e0a0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
e0b0: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
e0c0: 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53  init.busy || !pS
e0d0: 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  elect );..  /* I
e0e0: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
e0f0: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
e100: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
e110: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
e120: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
e130: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
e140: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
e150: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
e160: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
e170: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
e180: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
e190: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
e1a0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
e1b0: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
e1c0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
e1d0: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
e1e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
e1f0: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
e200: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
e210: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
e220: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
e230: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
e240: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
e250: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
e260: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
e270: 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   Special process
e280: 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20  ing for WITHOUT 
e290: 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a  ROWID Tables */.
e2a0: 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20    if( tabOpts & 
e2b0: 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20  TF_WithoutRowid 
e2c0: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74  ){.    if( (p->t
e2d0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
e2e0: 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29  PrimaryKey)==0 )
e2f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
e300: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e310: 22 6e 6f 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "no PRIMARY KEY 
e320: 66 6f 72 20 74 61 62 6c 65 20 25 73 22 2c 20 70  for table %s", p
e330: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
e340: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61  lse{.      p->ta
e350: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74  bFlags |= TF_Wit
e360: 68 6f 75 74 52 6f 77 69 64 3b 0a 20 20 20 20 20  houtRowid;.     
e370: 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
e380: 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72  tRowidTable(pPar
e390: 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
e3a0: 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  }..  iDb = sqlit
e3b0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
e3c0: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
e3d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e3e0: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a  _OMIT_CHECK.  /*
e3f0: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
e400: 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73  n all CHECK cons
e410: 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f  traint expressio
e420: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
e430: 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
e440: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
e450: 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
e460: 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63  se, p, NC_IsChec
e470: 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29  k, 0, p->pCheck)
e480: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
e490: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e4a0: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
e4b0: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68    /* Estimate th
e4c0: 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69  e average row si
e4d0: 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ze for the table
e4e0: 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70   and for all imp
e4f0: 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a  lied indices */.
e500: 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57    estimateTableW
e510: 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70  idth(p);.  for(p
e520: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
e530: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
e540: 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69  pNext){.    esti
e550: 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70  mateIndexWidth(p
e560: 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Idx);.  }..  /* 
e570: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
e580: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
e590: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
e5a0: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
e5b0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
e5c0: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
e5d0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
e5e0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
e5f0: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
e600: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
e610: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
e620: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
e630: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
e640: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
e650: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
e660: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
e670: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
e680: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
e690: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20     char *zType; 
e6a0: 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20     /* "view" or 
e6b0: 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63  "table" */.    c
e6c0: 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f  har *zType2;   /
e6d0: 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42  * "VIEW" or "TAB
e6e0: 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  LE" */.    char 
e6f0: 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65  *zStmt;    /* Te
e700: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
e710: 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
e720: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW statement 
e730: 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  */..    v = sqli
e740: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e750: 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e);.    if( NEVE
e760: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
e770: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
e780: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
e790: 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  lose, 0);..    /
e7a0: 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61  * .    ** Initia
e7b0: 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74  lize zType for t
e7c0: 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74  he new view or t
e7d0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
e7e0: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
e7f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
e800: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
e810: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
e820: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
e830: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
e840: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e850: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
e860: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
e870: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
e880: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
e890: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
e8a0: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
e8b0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
e8c0: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
e8d0: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
e8e0: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
e8f0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
e900: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
e910: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
e920: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
e930: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
e940: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
e950: 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  le is in registe
e960: 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  r pParse->regRoo
e970: 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
e980: 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54   Once the SELECT
e990: 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20   has been coded 
e9a0: 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  by sqlite3Select
e9b0: 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20  (), it is in a. 
e9c0: 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73     ** suitable s
e9d0: 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f  tate to query fo
e9e0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
e9f0: 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20  es and types to 
ea00: 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62  be used.    ** b
ea10: 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  y the new table.
ea20: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
ea30: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72   shared-cache wr
ea40: 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  ite-lock is not 
ea50: 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74  required to writ
ea60: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62  e to the new tab
ea70: 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  le,.    ** as a 
ea80: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74  schema-lock must
ea90: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
eaa0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63  en obtained to c
eab0: 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a  reate it. Since.
eac0: 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d      ** a schema-
ead0: 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c  lock excludes al
eae0: 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  l other database
eaf0: 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74   users, the writ
eb00: 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20  e-lock would.   
eb10: 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74   ** be redundant
eb20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
eb30: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
eb40: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
eb50: 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  t;.      Table *
eb60: 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20  pSelTab;..      
eb70: 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e  assert(pParse->n
eb80: 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73  Tab==1);.      s
eb90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
eba0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
ebb0: 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67  , 1, pParse->reg
ebc0: 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  Root, iDb);.    
ebd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ebe0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
ebf0: 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20  P2ISREG);.      
ec00: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
ec10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
ec20: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
ec30: 65 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  est, SRT_Table, 
ec40: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
ec50: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
ec60: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b  pSelect, &dest);
ec70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ec80: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
ec90: 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  lose, 1);.      
eca0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
ecb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
ecc0: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
ecd0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
ece0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
ecf0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
ed00: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
ed10: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
ed20: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
ed30: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
ed40: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
ed50: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ol;.        p->a
ed60: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
ed70: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65  Col;.        pSe
ed80: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
ed90: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
eda0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
edb0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
edc0: 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61  Table(db, pSelTa
edd0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
ede0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
edf0: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
ee00: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
ee10: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
ee20: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
ee30: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  {.      zStmt = 
ee40: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
ee50: 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73  db, p);.    }els
ee60: 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  e{.      Token *
ee70: 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20  pEnd2 = tabOpts 
ee80: 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  ? &pParse->sLast
ee90: 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20  Token : pEnd;.  
eea0: 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45      n = (int)(pE
eeb0: 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  nd2->z - pParse-
eec0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
eed0: 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d        if( pEnd2-
eee0: 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b  >z[0]!=';' ) n +
eef0: 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20  = pEnd2->n;.    
ef00: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
ef10: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20  3MPrintf(db, .  
ef20: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
ef30: 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32  %s %.*s", zType2
ef40: 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61  , n, pParse->sNa
ef50: 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20  meToken.z.      
ef60: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
ef70: 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20   A slot for the 
ef80: 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61  record has alrea
ef90: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
efa0: 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  d in the .    **
efb0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
efc0: 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e  able.  We just n
efd0: 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  eed to update th
efe0: 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c  at slot with all
eff0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f  .    ** the info
f000: 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f  rmation we've co
f010: 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  llected..    */.
f020: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
f030: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
f040: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
f050: 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
f060: 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
f070: 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
f080: 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  %Q, rootpage=#%d
f090: 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20  , sql=%Q ".     
f0a0: 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23    "WHERE rowid=#
f0b0: 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  %d",.      db->a
f0c0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
f0d0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
f0e0: 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20  ,.      zType,. 
f0f0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
f100: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
f110: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
f120: 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d  Root,.      zStm
f130: 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t,.      pParse-
f140: 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b  >regRowid.    );
f150: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
f160: 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20  ee(db, zStmt);. 
f170: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
f180: 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
f190: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
f1a0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
f1b0: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43  CREMENT.    /* C
f1c0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
f1d0: 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
f1e0: 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65   an sqlite_seque
f1f0: 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20  nce table for.  
f200: 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61    ** keeping tra
f210: 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d  ck of autoincrem
f220: 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f  ent keys..    */
f230: 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46  .    if( p->tabF
f240: 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
f250: 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  crement ){.     
f260: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
f270: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20  aDb[iDb];.      
f280: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
f290: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
f2a0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
f2b0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
f2c0: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
f2d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f2e0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
f2f0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
f300: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
f310: 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
f320: 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
f330: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
f340: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
f350: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
f360: 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
f370: 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
f380: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
f390: 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
f3a0: 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
f3b0: 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
f3c0: 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a  chemaOp(v, iDb,.
f3d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f3e0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74  e3MPrintf(db, "t
f3f0: 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  bl_name='%q' AND
f400: 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
f410: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ", p->zName));. 
f420: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
f430: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
f440: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
f450: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
f460: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
f470: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
f480: 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
f490: 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61  pOld;.    Schema
f4a0: 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70   *pSchema = p->p
f4b0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65  Schema;.    asse
f4c0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
f4d0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
f4e0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f  Db, 0) );.    pO
f4f0: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
f500: 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d  Insert(&pSchema-
f510: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
f520: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
f550: 28 70 2d 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20  (p->zName),p);. 
f560: 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
f570: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
f580: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
f590: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
f5a0: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
f5b0: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
f5c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f5d0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  d = 1;.      ret
f5e0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
f5f0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
f600: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c   = 0;.    db->fl
f610: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
f620: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69  ternChanges;..#i
f630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f640: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20  T_ALTERTABLE.   
f650: 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74   if( !p->pSelect
f660: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
f670: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
f680: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72  onst char *)pPar
f690: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
f6a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d  ;.      int nNam
f6b0: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
f6c0: 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f   !pSelect && pCo
f6d0: 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20  ns && pEnd );.  
f6e0: 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a      if( pCons->z
f6f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
f700: 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20  Cons = pEnd;.   
f710: 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65     }.      nName
f720: 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20   = (int)((const 
f730: 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20  char *)pCons->z 
f740: 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  - zName);.      
f750: 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20  p->addColOffset 
f760: 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74  = 13 + sqlite3Ut
f770: 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c  f8CharLen(zName,
f780: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23   nName);.    }.#
f790: 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66  endif.  }.}..#if
f7a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f7b0: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
f7c0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
f7d0: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
f7e0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
f7f0: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
f800: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
f810: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
f820: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
f830: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
f840: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
f850: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
f860: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
f870: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
f880: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
f890: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
f8a0: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
f8b0: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
f8c0: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
f8d0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
f8e0: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
f8f0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
f900: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
f910: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
f920: 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
f930: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
f940: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
f950: 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
f960: 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
f970: 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
f980: 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
f990: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
f9a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72          /* Suppr
f9b0: 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ess error messag
f9c0: 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61  es if VIEW alrea
f9d0: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
f9e0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
f9f0: 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t n;.  const cha
fa00: 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45  r *z;.  Token sE
fa10: 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46  nd;.  DbFixer sF
fa20: 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61  ix;.  Token *pNa
fa30: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44  me = 0;.  int iD
fa40: 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
fa50: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
fa60: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
fa70: 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ar>0 ){.    sqli
fa80: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
fa90: 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20  se, "parameters 
faa0: 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
fab0: 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20  in views");.    
fac0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
fad0: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
fae0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
faf0: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  }.  sqlite3Start
fb00: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
fb10: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
fb20: 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72  Temp, 1, 0, noEr
fb30: 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  r);.  p = pParse
fb40: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
fb50: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
fb60: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
fb70: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
fb80: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
fb90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
fba0: 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  .  sqlite3TwoPar
fbb0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
fbc0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
fbd0: 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73  Name);.  iDb = s
fbe0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
fbf0: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
fc00: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69  ma);.  sqlite3Fi
fc10: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
fc20: 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22  rse, iDb, "view"
fc30: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
fc40: 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74  sqlite3FixSelect
fc50: 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29  (&sFix, pSelect)
fc60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
fc70: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
fc80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
fc90: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
fca0: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
fcb0: 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
fcc0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
fcd0: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
fce0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
fcf0: 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
fd00: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
fd10: 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
fd20: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
fd30: 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
fd40: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
fd50: 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
fd60: 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
fd70: 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
fd80: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
fd90: 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  rrent sqlite3_ex
fda0: 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ec() call return
fdb0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65  s..  */.  p->pSe
fdc0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
fdd0: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c  lectDup(db, pSel
fde0: 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44  ect, EXPRDUP_RED
fdf0: 55 43 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  UCE);.  sqlite3S
fe00: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
fe10: 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20  pSelect);.  if( 
fe20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fe30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
fe40: 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e 69    }.  if( !db->i
fe50: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
fe60: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
fe70: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
fe80: 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , p);.  }..  /* 
fe90: 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f  Locate the end o
fea0: 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45  f the CREATE VIE
feb0: 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61  W statement.  Ma
fec0: 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f  ke sEnd point to
fed0: 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20  .  ** the end.. 
fee0: 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61   */.  sEnd = pPa
fef0: 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b  rse->sLastToken;
ff00: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 73 45  .  if( ALWAYS(sE
ff10: 6e 64 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73  nd.z[0]!=0) && s
ff20: 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b  End.z[0]!=';' ){
ff30: 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73  .    sEnd.z += s
ff40: 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e  End.n;.  }.  sEn
ff50: 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28  d.n = 0;.  n = (
ff60: 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42  int)(sEnd.z - pB
ff70: 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20  egin->z);.  z = 
ff80: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
ff90: 6c 65 28 20 41 4c 57 41 59 53 28 6e 3e 30 29 20  le( ALWAYS(n>0) 
ffa0: 26 26 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  && sqlite3Isspac
ffb0: 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d  e(z[n-1]) ){ n--
ffc0: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
ffd0: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
ffe0: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
fff0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
10000 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
10010 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
10020 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
10030 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
10040 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45  e(pParse, 0, &sE
10050 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  nd, 0, 0);.  ret
10060 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
10070 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
10080 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  W */..#if !defin
10090 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
100a0 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
100b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
100c0 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a  TUALTABLE)./*.**
100d0 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
100e0 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
100f0 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
10100 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
10110 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
10120 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
10130 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
10140 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
10150 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
10160 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
10170 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
10180 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
10190 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
101a0 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
101b0 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
101c0 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
101d0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
101e0 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
101f0 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
10200 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
10210 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
10220 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
10230 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
10240 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
10250 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
10260 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
10270 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
10280 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
10290 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
102a0 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
102b0 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
102c0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
102d0 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
102e0 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
102f0 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  igned */.  sqlit
10300 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10310 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
10320 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
10330 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a   malloc errors *
10340 2f 0a 20 20 69 6e 74 20 28 2a 78 41 75 74 68 29  /.  int (*xAuth)
10350 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
10360 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
10370 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  r*,const char*,c
10380 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20  onst char*);..  
10390 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29  assert( pTable )
103a0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
103b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
103c0 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65  BLE.  if( sqlite
103d0 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74  3VtabCallConnect
103e0 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29  (pParse, pTable)
103f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10400 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
10410 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
10420 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72  (pTable) ) retur
10430 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  n 0;.#endif..#if
10440 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10450 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73  _VIEW.  /* A pos
10460 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
10470 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
10480 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
10490 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
104a0 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
104b0 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
104c0 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
104d0 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
104e0 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
104f0 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
10500 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
10510 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
10520 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
10530 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
10540 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
10550 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
10560 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
10570 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
10580 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
10590 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
105a0 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
105b0 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
105c0 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
105d0 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
105e0 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
105f0 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
10600 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
10610 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
10620 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69  he error above i
10630 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69  s now caught pri
10640 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74  or to reaching t
10650 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
10660 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  But the followin
10670 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20  g test is still 
10680 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20  important as it 
10690 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a  does come up.  *
106a0 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * in the followi
106b0 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  ng:.  ** .  **  
106c0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
106d0 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a  main.ex1(a);.  *
106e0 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  *     CREATE TEM
106f0 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45  P VIEW ex1 AS SE
10700 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b  LECT a FROM ex1;
10710 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
10720 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31   * FROM temp.ex1
10730 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ;.  */.  if( pTa
10740 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
10750 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10760 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
10770 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
10780 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
10790 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
107a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
107b0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
107c0 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nCol>=0 );..  /*
107d0 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
107e0 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
107f0 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
10800 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
10810 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  ..  ** Note that
10820 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
10830 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
10840 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70  elect() will exp
10850 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22  and any.  ** "*"
10860 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
10870 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20   results set of 
10880 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c  the view and wil
10890 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73  l assign cursors
108a0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65  .  ** to the ele
108b0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f  ments of the FRO
108c0 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77  M clause.  But w
108d0 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68  e do not want th
108e0 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ese changes.  **
108f0 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74   to be permanent
10900 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74  .  So the comput
10910 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e  ation is done on
10920 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
10930 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65  ELECT.  ** state
10940 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
10950 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f  s the view..  */
10960 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
10970 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20  e->pSelect );.  
10980 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65  pSel = sqlite3Se
10990 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
109a0 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  le->pSelect, 0);
109b0 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20  .  if( pSel ){. 
109c0 20 20 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b     u8 enableLook
109d0 61 73 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b  aside = db->look
109e0 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a  aside.bEnabled;.
109f0 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e      n = pParse->
10a00 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  nTab;.    sqlite
10a10 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
10a20 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
10a30 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70  el->pSrc);.    p
10a40 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
10a50 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
10a60 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30  ide.bEnabled = 0
10a70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
10a80 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
10a90 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20  ION.    xAuth = 
10aa0 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64  db->xAuth;.    d
10ab0 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->xAuth = 0;.  
10ac0 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
10ad0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
10ae0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
10af0 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  l);.    db->xAut
10b00 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65  h = xAuth;.#else
10b10 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
10b20 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
10b30 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
10b40 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  pSel);.#endif.  
10b50 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
10b60 62 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c  bEnabled = enabl
10b70 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20  eLookaside;.    
10b80 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
10b90 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61  ;.    if( pSelTa
10ba0 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  b ){.      asser
10bb0 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
10bc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
10bd0 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
10be0 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
10bf0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
10c00 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
10c10 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
10c20 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
10c30 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
10c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
10c50 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65  eteTable(db, pSe
10c60 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 61 73 73  lTab);.      ass
10c70 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
10c80 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
10c90 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  0, pTable->pSche
10ca0 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ma) );.      pTa
10cb0 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c  ble->pSchema->fl
10cc0 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65  ags |= DB_Unrese
10cd0 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73  tViews;.    }els
10ce0 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  e{.      pTable-
10cf0 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
10d00 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nErr++;.    }. 
10d10 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
10d20 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29  Delete(db, pSel)
10d30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
10d40 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e   nErr++;.  }.#en
10d50 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10d60 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74  IT_VIEW */.  ret
10d70 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
10d80 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10d90 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
10da0 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
10db0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
10dc0 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
10dd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10de0 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  _VIEW./*.** Clea
10df0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
10e00 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49  es from every VI
10e10 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  EW in database i
10e20 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dx..*/.static vo
10e30 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  id sqliteViewRes
10e40 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  etAll(sqlite3 *d
10e50 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
10e60 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73  ashElem *i;.  as
10e70 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
10e80 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
10e90 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66   idx, 0) );.  if
10ea0 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
10eb0 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
10ec0 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
10ed0 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
10ee0 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
10ef0 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65  ->aDb[idx].pSche
10f00 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b  ma->tblHash); i;
10f10 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
10f20 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
10f30 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
10f40 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
10f50 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
10f60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10f70 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
10f80 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  s(db, pTab);.   
10f90 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20     pTab->aCol = 
10fa0 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  0;.      pTab->n
10fb0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Col = 0;.    }. 
10fc0 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
10fd0 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
10fe0 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
10ff0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
11000 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
11010 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
11020 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
11030 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
11040 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11050 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
11060 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
11070 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
11080 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
11090 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
110a0 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
110b0 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
110c0 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
110d0 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
110e0 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
110f0 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
11100 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
11110 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63  o iTo..**.** Tic
11120 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20  ket #1728:  The 
11130 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67  symbol table mig
11140 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  ht still contain
11150 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
11160 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72  on tables and/or
11170 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72   indices that ar
11180 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  e the process of
11190 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
111a0 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e  ** If you are un
111b0 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68  lucky, one of th
111c0 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  ose deleted indi
111d0 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69  ces or tables mi
111e0 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ght.** have the 
111f0 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75  same rootpage nu
11200 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c  mber as the real
11210 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
11220 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67  that is.** being
11230 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63   moved.  So we c
11240 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63  annot stop searc
11250 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66  hing after the f
11260 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62  irst match .** b
11270 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74  ecause the first
11280 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20   match might be 
11290 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64  for one of the d
112a0 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a  eleted indices.*
112b0 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20  * or tables and 
112c0 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e  not the table/in
112d0 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75  dex that is actu
112e0 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64  ally being moved
112f0 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e  ..** We must con
11300 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e  tinue looping un
11310 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  til all tables a
11320 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a  nd indices with.
11330 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72  ** rootpage==iFr
11340 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e  om have been con
11350 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61  verted to have a
11360 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f   rootpage of iTo
11370 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
11380 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  be certain that 
11390 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74  we got the right
113a0 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   one..*/.#ifndef
113b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
113c0 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
113d0 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
113e0 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  d(sqlite3 *db, i
113f0 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f  nt iDb, int iFro
11400 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
11410 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
11420 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20    Hash *pHash;. 
11430 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
11440 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
11450 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
11460 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62  iDb, 0) );.  pDb
11470 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
11480 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  ;.  pHash = &pDb
11490 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
114a0 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
114b0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
114c0 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
114d0 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
114e0 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
114f0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
11500 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
11510 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54  lem);.    if( pT
11520 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  ab->tnum==iFrom 
11530 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  ){.      pTab->t
11540 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
11550 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26  .  }.  pHash = &
11560 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  pDb->pSchema->id
11570 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  xHash;.  for(pEl
11580 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
11590 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
115a0 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
115b0 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
115c0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
115d0 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
115e0 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
115f0 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pIdx->tnum==iFr
11600 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  om ){.      pIdx
11610 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
11620 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
11630 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f  ../*.** Write co
11640 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20  de to erase the 
11650 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
11660 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d  page iTable from
11670 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a   database iDb..*
11680 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64  * Also write cod
11690 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
116a0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
116b0 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  ble and internal
116c0 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20   schema.** if a 
116d0 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f  root-page of ano
116e0 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
116f0 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
11700 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a  -layer whilst.**
11710 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20   erasing iTable 
11720 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
11730 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
11740 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
11750 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
11760 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
11770 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
11780 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69  nt iTable, int i
11790 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
117a0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
117b0 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
117c0 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
117d0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
117e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
117f0 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  p3(v, OP_Destroy
11800 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44  , iTable, r1, iD
11810 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79  b);.  sqlite3May
11820 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23  Abort(pParse);.#
11830 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11840 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
11850 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74  /* OP_Destroy st
11860 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67  ores an in integ
11870 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69  er r1. If this i
11880 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
11890 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
118a0 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
118b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
118c0 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
118d0 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
118e0 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
118f0 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
11900 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
11910 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
11920 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
11930 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e  *.  ** The "#NNN
11940 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
11950 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
11960 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
11970 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
11980 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  * is in register
11990 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d   NNN.  See gramm
119a0 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61  ar rules associa
119b0 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f  ted with the TK_
119c0 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f  REGISTER.  ** to
119d0 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ken for addition
119e0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
119f0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
11a00 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
11a10 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
11a20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
11a30 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20  ge=%d WHERE #%d 
11a40 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  AND rootpage=#%d
11a50 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
11a60 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
11a70 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
11a80 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72  (iDb), iTable, r
11a90 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20  1, r1);.#endif. 
11aa0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
11ab0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
11ac0 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  1);.}../*.** Wri
11ad0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  te VDBE code to 
11ae0 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62  erase table pTab
11af0 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61   and all associa
11b00 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64  ted indices on d
11b10 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20  isk..** Code to 
11b20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74  update the sqlit
11b30 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
11b40 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
11b50 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ema definitions.
11b60 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f  ** in case a roo
11b70 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  t-page belonging
11b80 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   to another tabl
11b90 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
11ba0 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a  e btree layer.**
11bb0 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28   is also added (
11bc0 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
11bd0 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
11be0 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
11bf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
11c00 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65  stroyTable(Parse
11c10 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
11c20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53  *pTab){.#ifdef S
11c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
11c40 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70  ACUUM.  Index *p
11c50 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d  Idx;.  int iDb =
11c60 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
11c70 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
11c80 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
11c90 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  ;.  destroyRootP
11ca0 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  age(pParse, pTab
11cb0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
11cc0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
11cd0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
11ce0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
11cf0 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
11d00 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  age(pParse, pIdx
11d10 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
11d20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20  }.#else.  /* If 
11d30 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
11d40 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   be auto-vacuum 
11d50 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49  capable (if SQLI
11d60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11d70 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  UM.  ** is not d
11d80 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74  efined), then it
11d90 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
11da0 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79   call OP_Destroy
11db0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   on the.  ** tab
11dc0 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f  le and index roo
11dd0 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72  t-pages in order
11de0 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
11df0 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
11e00 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f  .  ** largest ro
11e10 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
11e20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
11e30 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
11e40 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a   root-pages.  **
11e50 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
11e60 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79   is relocated by
11e70 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44   an earlier OP_D
11e80 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20  estroy. i.e. if 
11e90 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  the.  ** followi
11ea0 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20  ng were coded:. 
11eb0 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74   **.  ** OP_Dest
11ec0 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e  roy 4 0.  ** ...
11ed0 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
11ee0 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61   5 0.  **.  ** a
11ef0 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68  nd root page 5 h
11f00 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68  appened to be th
11f10 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
11f20 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  age number in th
11f30 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
11f40 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20   then root page 
11f50 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64  5 would be moved
11f60 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68   to page 4 by th
11f70 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74  e .  ** "OP_Dest
11f80 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e  roy 4 0" opcode.
11f90 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
11fa0 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22  "OP_Destroy 5 0"
11fb0 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20   would hit.  ** 
11fc0 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  a free-list page
11fd0 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ..  */.  int iTa
11fe0 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  b = pTab->tnum;.
11ff0 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64    int iDestroyed
12000 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
12010 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  1 ){.    Index *
12020 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c  pIdx;.    int iL
12030 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  argest = 0;..   
12040 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d   if( iDestroyed=
12050 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74  =0 || iTab<iDest
12060 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69  royed ){.      i
12070 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a  Largest = iTab;.
12080 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
12090 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
120a0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
120b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
120c0 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d  int iIdx = pIdx-
120d0 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73  >tnum;.      ass
120e0 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
120f0 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
12100 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  a );.      if( (
12110 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
12120 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65   (iIdx<iDestroye
12130 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72  d)) && iIdx>iLar
12140 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  gest ){.        
12150 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b  iLargest = iIdx;
12160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12170 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d     if( iLargest=
12180 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
12190 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rn;.    }else{. 
121a0 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
121b0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
121c0 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
121d0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
121e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
121f0 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72  b>=0 && iDb<pPar
12200 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
12210 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74       destroyRoot
12220 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61  Page(pParse, iLa
12230 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20  rgest, iDb);.   
12240 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20     iDestroyed = 
12250 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a  iLargest;.    }.
12260 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
12270 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69  .** Remove entri
12280 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  es from the sqli
12290 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20  te_statN tables 
122a0 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33  (for N in (1,2,3
122b0 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52  )).** after a DR
122c0 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50  OP INDEX or DROP
122d0 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a   TABLE command..
122e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
122f0 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
12300 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a  ables(.  Parse *
12310 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
12320 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
12330 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
12340 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
12350 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
12360 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  se number */.  c
12370 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
12380 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f  ,     /* "idx" o
12390 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e  r "tbl" */.  con
123a0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
123b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69      /* Name of i
123c0 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f  ndex or table */
123d0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
123e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
123f0 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  me = pParse->db-
12400 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
12410 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34  .  for(i=1; i<=4
12420 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
12430 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73   zTab[24];.    s
12440 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
12450 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61  sizeof(zTab),zTa
12460 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64  b,"sqlite_stat%d
12470 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ",i);.    if( sq
12480 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
12490 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c  Parse->db, zTab,
124a0 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20   zDbName) ){.   
124b0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
124c0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
124d0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
124e0 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25  OM %Q.%s WHERE %
124f0 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a  s=%Q",.        z
12500 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54  DbName, zTab, zT
12510 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20  ype, zName.     
12520 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
12530 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12540 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74  code to drop a t
12550 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
12560 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62  lite3CodeDropTab
12570 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
12580 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69  , Table *pTab, i
12590 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69  nt iDb, int isVi
125a0 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ew){.  Vdbe *v;.
125b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
125c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72  pParse->db;.  Tr
125d0 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
125e0 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  .  Db *pDb = &db
125f0 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76  ->aDb[iDb];..  v
12600 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12610 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
12620 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
12630 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
12640 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
12650 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
12660 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12670 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
12680 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
12690 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
126a0 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
126b0 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23  P_VBegin);.  }.#
126c0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
126d0 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
126e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
126f0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
12700 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a  opped. Code.  **
12710 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
12720 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   remove entries 
12730 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
12740 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73  er and/or.  ** s
12750 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
12760 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
12770 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d   */.  pTrigger =
12780 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c   sqlite3TriggerL
12790 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
127a0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69  );.  while( pTri
127b0 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65  gger ){.    asse
127c0 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
127d0 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
127e0 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
127f0 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
12800 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
12810 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
12820 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
12830 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
12840 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67  gger);.    pTrig
12850 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
12860 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  pNext;.  }..#ifn
12870 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12880 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
12890 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
128a0 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
128b0 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
128c0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
128d0 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  th.  ** the tabl
128e0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
128f0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
12900 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
12910 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61  s dropped.  ** a
12920 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
12930 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
12940 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
12950 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
12960 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
12970 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
12980 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
12990 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
129a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
129b0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
129c0 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
129d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  {.    sqlite3Nes
129e0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
129f0 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
12a00 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  ROM %Q.sqlite_se
12a10 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
12a20 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62  e=%Q",.      pDb
12a30 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
12a40 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Name.    );.  }.
12a50 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f  #endif..  /* Dro
12a60 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
12a70 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
12a80 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
12a90 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
12aa0 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
12ab0 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
12ac0 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
12ad0 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
12ae0 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79  letes.  ** every
12af0 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
12b00 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
12b10 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
12b20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
12b30 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67  ** dropped. Trig
12b40 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64  gers are handled
12b50 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 63 61   separately beca
12b60 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61  use a trigger ca
12b70 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65  n be.  ** create
12b80 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
12b90 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65  tabase that refe
12ba0 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e  rs to a table in
12bb0 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61   another.  ** da
12bc0 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73  tabase..  */.  s
12bd0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
12be0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
12bf0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
12c00 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%s WHERE tbl_na
12c10 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
12c20 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
12c30 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43    pDb->zName, SC
12c40 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
12c50 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
12c60 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
12c70 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
12c80 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54   ){.    destroyT
12c90 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
12ca0 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  b);.  }..  /* Re
12cb0 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
12cc0 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
12cd0 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
12ce0 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
12cf0 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ** the schema co
12d00 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  okie..  */.  if(
12d10 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
12d20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
12d30 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12d40 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
12d50 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
12d60 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
12d70 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12d80 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
12d90 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
12da0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
12db0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
12dc0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
12dd0 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
12de0 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a  All(db, iDb);.}.
12df0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12e00 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
12e10 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
12e20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
12e30 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
12e40 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
12e50 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
12e60 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
12e70 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
12e80 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
12e90 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
12ea0 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
12eb0 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
12ec0 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
12ed0 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
12ee0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
12ef0 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
12f00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12f10 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
12f20 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
12f30 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
12f40 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
12f50 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
12f60 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
12f70 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
12f80 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70  ppressErr++;.  p
12f90 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
12fa0 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
12fb0 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e  rse, isView, &pN
12fc0 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66  ame->a[0]);.  if
12fd0 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
12fe0 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20  ppressErr--;..  
12ff0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
13000 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73     if( noErr ) s
13010 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
13020 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
13030 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
13040 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
13050 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
13060 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20  able;.  }.  iDb 
13070 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
13080 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
13090 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
130a0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
130b0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
130c0 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61   /* If pTab is a
130d0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
130e0 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75  call ViewGetColu
130f0 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73  mnNames() to ens
13100 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69  ure.  ** it is i
13110 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
13120 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
13130 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65  (pTab) && sqlite
13140 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
13150 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
13160 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
13170 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
13180 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13190 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
131a0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
131b0 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   code;.    const
131c0 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
131d0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
131e0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
131f0 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
13200 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
13210 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
13220 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
13230 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
13240 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
13250 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
13260 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
13270 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13290 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
132a0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
132b0 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
132c0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
132d0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
132e0 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
132f0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
13300 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
13310 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
13320 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
13330 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
13340 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
13350 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
13360 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
13370 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20  DROP_VTABLE;.   
13380 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74     zArg2 = sqlit
13390 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
133a0 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61  pTab)->pMod->zNa
133b0 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  me;.#endif.    }
133c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
133d0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
133e0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
133f0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
13400 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
13410 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13420 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
13430 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
13440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13450 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
13460 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
13470 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ode, pTab->zName
13480 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b  , zArg2, zDb) ){
13490 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
134a0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
134b0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
134c0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
134d0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
134e0 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
134f0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
13500 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
13510 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
13520 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
13530 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
13540 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
13550 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
13560 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
13570 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
13580 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20   "sqlite_stat", 
13590 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  11)!=0 ){.    sq
135a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
135b0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
135c0 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
135d0 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
135e0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
135f0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
13600 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13610 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
13620 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c  Ensure DROP TABL
13630 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e  E is not used on
13640 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f   a view, and DRO
13650 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73  P VIEW is not us
13660 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62  ed.  ** on a tab
13670 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  le..  */.  if( i
13680 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
13690 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
136a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
136b0 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
136c0 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
136d0 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
136e0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
136f0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
13700 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
13710 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
13720 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
13730 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13740 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
13750 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
13760 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
13770 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
13780 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13790 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
137a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
137b0 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
137c0 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d  table from the m
137d0 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  aster table.  **
137e0 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   on disk..  */. 
137f0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13800 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13810 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
13820 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
13830 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
13840 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
13850 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
13860 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
13870 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  "tbl", pTab->zNa
13880 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
13890 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  FkDropTable(pPar
138a0 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29  se, pName, pTab)
138b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ;.    sqlite3Cod
138c0 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73  eDropTable(pPars
138d0 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73  e, pTab, iDb, is
138e0 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  View);.  }..exit
138f0 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
13900 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
13910 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
13920 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
13930 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
13940 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
13950 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
13960 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
13970 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
13980 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
13990 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
139a0 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
139b0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
139c0 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
139d0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
139e0 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
139f0 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
13a00 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
13a10 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
13a20 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
13a30 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
13a40 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
13a50 20 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72   (a.k.a the "par
13a60 65 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54  ent" table).  pT
13a70 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a  oCol is a list.*
13a80 2a 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  * of tables in t
13a90 68 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61  he parent pTo ta
13aa0 62 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74  ble.  flags cont
13ab0 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
13ac0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
13ad0 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
13ae0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
13af0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
13b00 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
13b10 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
13b20 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
13b30 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
13b40 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
13b50 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
13b60 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
13b70 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
13b80 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
13b90 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
13ba0 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ble field..**.**
13bb0 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
13bc0 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
13bd0 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
13be0 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
13bf0 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
13c00 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
13c10 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
13c20 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
13c30 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
13c40 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
13c50 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
13c60 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
13c70 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13c80 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
13c90 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
13ca0 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
13cb0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
13cc0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
13cd0 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
13ce0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
13cf0 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
13d00 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
13d10 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
13d20 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
13d30 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
13d40 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
13d50 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
13d60 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
13d70 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  hms. */.){.  sql
13d80 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
13d90 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
13da0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
13db0 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
13dc0 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79  FKey = 0;.  FKey
13dd0 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62   *pNextTo;.  Tab
13de0 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
13df0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
13e00 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
13e10 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
13e20 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
13e30 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
13e40 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  f( p==0 || IN_DE
13e50 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
13e60 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
13e70 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
13e80 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
13e90 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
13ea0 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29   NEVER(iCol<0) )
13eb0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
13ec0 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
13ed0 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
13ee0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13ef0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13f00 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
13f10 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
13f20 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
13f30 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
13f40 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
13f50 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
13f60 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
13f70 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
13f80 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
13f90 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
13fa0 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
13fb0 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
13fc0 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
13fd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13fe0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
13ff0 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
14000 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
14010 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
14020 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
14030 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
14040 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
14050 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
14060 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
14070 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
14080 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
14090 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
140a0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
140b0 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31  pFKey) + (nCol-1
140c0 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  )*sizeof(pFKey->
140d0 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
140e0 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
140f0 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
14100 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
14110 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
14120 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
14130 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
14140 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
14150 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
14160 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62  FKey = sqlite3Db
14170 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
14180 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
14190 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  Key==0 ){.    go
141a0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
141b0 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
141c0 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
141d0 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
141e0 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
141f0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c  pFKey->aCol[nCol
14200 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  ];.  pFKey->zTo 
14210 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
14220 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
14230 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
14240 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
14250 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70  ote(z);.  z += p
14260 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
14270 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
14280 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
14290 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
142a0 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
142b0 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
142c0 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
142d0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
142e0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
142f0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
14300 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
14310 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
14320 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
14330 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
14340 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
14350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
14360 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
14370 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
14380 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14390 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
143a0 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
143b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
143c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
143d0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
143e0 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
143f0 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
14400 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
14410 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
14420 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
14430 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
14440 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
14450 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
14460 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
14470 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
14480 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
14490 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
144a0 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
144b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
144c0 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
144d0 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
144e0 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
144f0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
14500 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
14510 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
14520 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
14530 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
14540 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  ;.  pFKey->aActi
14550 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61  on[0] = (u8)(fla
14560 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20  gs & 0xff);     
14570 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c         /* ON DEL
14580 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ETE action */.  
14590 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31  pFKey->aAction[1
145a0 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20  ] = (u8)((flags 
145b0 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20  >> 8 ) & 0xff); 
145c0 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20     /* ON UPDATE 
145d0 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  action */..  ass
145e0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
145f0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
14600 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29  0, p->pSchema) )
14610 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46  ;.  pNextTo = (F
14620 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73  Key *)sqlite3Has
14630 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68  hInsert(&p->pSch
14640 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a  ema->fkeyHash, .
14650 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
14660 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
14670 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28  0(pFKey->zTo), (
14680 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29  void *)pFKey.  )
14690 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d  ;.  if( pNextTo=
146a0 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64 62  =pFKey ){.    db
146b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
146c0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f   1;.    goto fk_
146d0 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
146e0 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73  NextTo ){.    as
146f0 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70  sert( pNextTo->p
14700 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20  PrevTo==0 );.   
14710 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
14720 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70  = pNextTo;.    p
14730 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20  NextTo->pPrevTo 
14740 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20  = pFKey;.  }..  
14750 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
14760 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
14770 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
14780 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
14790 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
147a0 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
147b0 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44  _end:.  sqlite3D
147c0 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
147d0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
147e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
147f0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
14800 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
14810 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72  stDelete(db, pFr
14820 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
14830 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
14840 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  db, pToCol);.}..
14850 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
14860 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
14870 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
14880 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
14890 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
148a0 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
148b0 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
148c0 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
148d0 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
148e0 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
148f0 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
14900 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
14910 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
14920 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
14930 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
14940 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
14950 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
14960 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
14970 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
14980 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
14990 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
149a0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
149b0 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
149c0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
149d0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
149e0 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
149f0 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
14a00 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
14a10 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
14a20 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
14a30 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
14a40 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
14a50 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d  rt( isDeferred==
14a60 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d  0 || isDeferred=
14a70 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  =1 ); /* EV: R-3
14a80 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20  0323-21917 */.  
14a90 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
14aa0 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72  d = (u8)isDeferr
14ab0 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
14ac0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
14ad0 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73  e that will eras
14ae0 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64  e and refill ind
14af0 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20  ex *pIdx.  This 
14b00 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e  is.** used to in
14b10 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79  itialize a newly
14b20 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f   created index o
14b30 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  r to recompute t
14b40 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
14b50 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73   an index in res
14b60 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44  ponse to a REIND
14b70 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
14b80 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65  * if memRootPage
14b90 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65   is not negative
14ba0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
14bb0 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77  the index is new
14bc0 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20  ly.** created.  
14bd0 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65  The register spe
14be0 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f  cified by memRoo
14bf0 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74  tPage contains t
14c00 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
14c10 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
14c20 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74  dex.  If memRoot
14c30 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
14c40 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e  , then.** the in
14c50 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
14c60 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63  ts and must be c
14c70 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65  leared before be
14c80 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64  ing refilled and
14c90 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
14ca0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
14cb0 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66  index is taken f
14cc0 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  rom pIndex->tnum
14cd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14ce0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
14cf0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
14d00 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  e, Index *pIndex
14d10 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67  , int memRootPag
14d20 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  e){.  Table *pTa
14d30 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
14d40 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  le;  /* The tabl
14d50 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65  e that is indexe
14d60 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  d */.  int iTab 
14d70 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14d80 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
14d90 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
14da0 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  Tab */.  int iId
14db0 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
14dc0 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
14dd0 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
14de0 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74   pIndex */.  int
14df0 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20   iSorter;       
14e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14e10 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20  ursor opened by 
14e20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69  OpenSorter (if i
14e30 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20  n use) */.  int 
14e40 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
14e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
14e60 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20  dress of top of 
14e70 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
14e80 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr2;            
14e90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
14ea0 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66  ess to jump to f
14eb0 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  or next iteratio
14ec0 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  n */.  int tnum;
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ee0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
14ef0 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
14f00 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62   int iPartIdxLab
14f10 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
14f20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20  /* Jump to this 
14f30 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20  label to skip a 
14f40 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  row */.  Vdbe *v
14f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14f60 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
14f70 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
14f80 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
14f90 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
14fa0 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
14fb0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
14fc0 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
14fd0 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
15000 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69  ing assemblied i
15010 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
15020 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15030 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
15040 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
15050 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
15060 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
15070 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
15080 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
15090 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
150a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
150b0 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
150c0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
150d0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
150e0 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
150f0 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64  Name, 0,.      d
15100 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
15110 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
15120 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
15130 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
15140 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
15150 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
15160 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
15170 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
15180 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
15190 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
151a0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
151b0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
151c0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
151d0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
151e0 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
151f0 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
15200 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61  tnum = memRootPa
15210 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
15220 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
15230 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79  tnum;.  }.  pKey
15240 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
15250 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
15260 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70  Index);..  /* Op
15270 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75  en the sorter cu
15280 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74  rsor if we are t
15290 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  o use one. */.  
152a0 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65  iSorter = pParse
152b0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
152c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
152d0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
152e0 69 53 6f 72 74 65 72 2c 20 30 2c 20 30 2c 20 28  iSorter, 0, 0, (
152f0 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  char*)pKey, P4_K
15300 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f  EYINFO);..  /* O
15310 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c  pen the table. L
15320 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
15330 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c  rows of the tabl
15340 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64  e, inserting ind
15350 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20  ex.  ** records 
15360 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  into the sorter.
15370 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65   */.  sqlite3Ope
15380 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
15390 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
153a0 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
153b0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
153c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
153d0 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
153e0 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
153f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15400 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71  g(pParse);..  sq
15410 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
15420 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
15430 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52  ndex, iTab, regR
15440 65 63 6f 72 64 2c 20 30 2c 20 26 69 50 61 72 74  ecord, 0, &iPart
15450 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  IdxLabel);.  sql
15460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15470 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
15480 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  t, iSorter, regR
15490 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
154a0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
154b0 6c 28 76 2c 20 69 50 61 72 74 49 64 78 4c 61 62  l(v, iPartIdxLab
154c0 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  el);.  sqlite3Vd
154d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
154e0 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
154f0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
15500 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
15510 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52  dr1);.  if( memR
15520 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69  ootPage<0 ) sqli
15530 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15540 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
15550 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
15560 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
15570 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
15580 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20  , tnum, iDb, .  
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20    (char *)pKey, 
155b0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
155c0 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  FF);.  sqlite3Vd
155d0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
155e0 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d  FLAG_BULKCSR|((m
155f0 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f  emRootPage>=0)?O
15600 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29  PFLAG_P2ISREG:0)
15610 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71  );..  addr1 = sq
15620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15630 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
15640 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 0a 20  , iSorter, 0);. 
15650 20 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30   assert( pKey!=0
15660 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
15670 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
15680 6e 45 72 72 20 29 3b 0a 20 20 69 66 28 20 70 49  nErr );.  if( pI
15690 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
156a0 45 5f 4e 6f 6e 65 20 26 26 20 70 4b 65 79 21 3d  E_None && pKey!=
156b0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20  0 ){.    int j2 
156c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
156d0 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b  rentAddr(v) + 3;
156e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
156f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
15700 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20 61  o, 0, j2);.    a
15710 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
15720 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15740 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
15750 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20  _SorterCompare, 
15760 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67  iSorter, j2, reg
15770 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20  Record,.        
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15790 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 2d 20   pKey->nField - 
157a0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29  pIndex->nKeyCol)
157b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69  ;.    sqlite3Uni
157c0 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  queConstraint(pP
157d0 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
157e0 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65  pIndex);.  }else
157f0 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  {.    addr2 = sq
15800 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
15810 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73  Addr(v);.  }.  s
15820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15830 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
15840 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  a, iSorter, regR
15850 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
15860 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15870 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
15880 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29  x, regRecord, 1)
15890 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
158a0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
158b0 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
158c0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
158d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
158e0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
158f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15900 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
15910 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64  xt, iSorter, add
15920 72 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r2);.  sqlite3Vd
15930 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
15940 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  dr1);..  sqlite3
15950 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15960 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20  _Close, iTab);. 
15970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15980 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
15990 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  iIdx);.  sqlite3
159a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
159b0 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29  _Close, iSorter)
159c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
159d0 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20 74  ate heap space t
159e0 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20  o hold an Index 
159f0 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c  object with nCol
15a00 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20   columns..**.** 
15a10 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  Increase the all
15a20 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20  ocation size to 
15a30 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61  provide an extra
15a40 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
15a50 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   of 8-byte align
15a60 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20 74  ed space after t
15a70 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
15a80 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20  and return a.** 
15a90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
15aa0 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a  extra space in *
15ab0 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65  ppExtra..*/.Inde
15ac0 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61  x *sqlite3Alloca
15ad0 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20  teIndexObject(. 
15ae0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
15af0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
15b00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
15b10 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20    i16 nCol,     
15b20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
15b30 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
15b40 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
15b50 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
15b60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15b70 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65  er of bytes of e
15b80 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c  xtra space to al
15b90 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  loc */.  char **
15ba0 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a  ppExtra       /*
15bb0 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
15bc0 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f  "extra" space */
15bd0 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20  .){.  Index *p; 
15be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
15bf0 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62  located index ob
15c00 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ject */.  int nB
15c10 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  yte;           /
15c20 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
15c30 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63   for Index objec
15c40 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20  t + arrays */.. 
15c50 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
15c60 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b  sizeof(Index)) +
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15c80 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
15c90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
15ca0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61  OUND8(sizeof(cha
15cb0 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20  r*)*nCol) +     
15cc0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43      /* Index.azC
15cd0 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  oll     */.     
15ce0 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
15cf0 6f 66 28 74 52 6f 77 63 6e 74 29 2a 28 6e 43 6f  of(tRowcnt)*(nCo
15d00 6c 2b 31 29 20 2b 20 20 20 20 2f 2a 20 49 6e 64  l+1) +    /* Ind
15d10 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f  ex.aiRowEst   */
15d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15d30 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43    sizeof(i16)*nC
15d40 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  ol +            
15d50 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d  /* Index.aiColum
15d60 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  n   */.         
15d70 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75          sizeof(u
15d80 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20  8)*nCol);       
15d90 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
15da0 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70  SortOrder */.  p
15db0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
15dc0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
15dd0 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66   + nExtra);.  if
15de0 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ( p ){.    char 
15df0 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72  *pExtra = ((char
15e00 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)+ROUND8(size
15e10 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
15e20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  p->azColl = (cha
15e30 72 2a 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20  r**)pExtra;     
15e40 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44   pExtra += ROUND
15e50 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  8(sizeof(char*)*
15e60 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69  nCol);.    p->ai
15e70 52 6f 77 45 73 74 20 3d 20 28 74 52 6f 77 63 6e  RowEst = (tRowcn
15e80 74 2a 29 70 45 78 74 72 61 3b 20 20 70 45 78 74  t*)pExtra;  pExt
15e90 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 74 52 6f  ra += sizeof(tRo
15ea0 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a  wcnt)*(nCol+1);.
15eb0 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20      p->aiColumn 
15ec0 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20  = (i16*)pExtra; 
15ed0 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73       pExtra += s
15ee0 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b  izeof(i16)*nCol;
15ef0 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
15f00 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61  er = (u8*)pExtra
15f10 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e  ;.    p->nColumn
15f20 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = nCol;.    p->
15f30 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d  nKeyCol = nCol -
15f40 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61   1;.    *ppExtra
15f50 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20   = ((char*)p) + 
15f60 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
15f70 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
15f80 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
15f90 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
15fa0 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
15fb0 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
15fc0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
15fd0 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
15fe0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
15ff0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
16000 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
16010 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
16020 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
16030 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
16040 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
16050 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
16060 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
16070 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
16080 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
16090 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
160a0 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
160b0 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
160c0 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
160d0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
160e0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
160f0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
16100 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
16110 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
16120 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
16130 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
16140 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
16150 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
16160 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
16170 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
16180 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
16190 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
161a0 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
161b0 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
161c0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
161d0 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
161e0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
161f0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69   .**.** If the i
16200 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
16210 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65  successfully, re
16220 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
16230 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a  o the new Index.
16240 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  ** structure. Th
16250 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73 71  is is used by sq
16260 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
16270 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65  ey() to mark the
16280 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65   index.** as the
16290 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20   tables primary 
162a0 6b 65 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49  key (Index.autoI
162b0 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64  ndex==2)..*/.Ind
162c0 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74  ex *sqlite3Creat
162d0 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
162e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
162f0 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
16300 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
16310 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
16320 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  me1,     /* Firs
16330 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
16340 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
16350 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
16360 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63  ame2,     /* Sec
16370 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
16380 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
16390 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
163a0 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54   *pTblName, /* T
163b0 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
163c0 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
163d0 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
163e0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
163f0 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
16400 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
16410 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
16420 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
16430 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
16440 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
16450 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
16460 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
16470 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
16480 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
16490 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65  ins this stateme
164a0 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50  nt */.  Expr *pP
164b0 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48  IWhere,    /* WH
164c0 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70  ERE clause for p
164d0 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a  artial indices *
164e0 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
164f0 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
16500 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
16510 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
16520 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
16530 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20  NotExist     /* 
16540 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
16550 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
16560 74 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ts */.){.  Index
16570 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
16580 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65  /* Pointer to re
16590 74 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  turn */.  Table 
165a0 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
165b0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
165c0 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
165d0 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
165e0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
165f0 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
16600 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
16610 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16620 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
16630 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
16640 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16650 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
16660 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
16670 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46   j;.  DbFixer sF
16680 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
16690 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
166a0 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
166b0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
166c0 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
166d0 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
166e0 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
166f0 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
16700 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
16710 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
16720 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
16730 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
16740 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
16750 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
16760 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
16770 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
16780 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
16790 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
167a0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
167b0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
167c0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
167d0 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
167e0 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
167f0 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
16800 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
16810 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
16820 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
16830 69 73 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 43  ist */.  const C
16840 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 20  olumn *pTabCol; 
16850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
16860 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
16870 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  le */.  int nExt
16880 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ra = 0;         
16890 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
168a0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
168b0 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e  zExtra[] */.  in
168c0 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20  t nExtraCol;    
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
168e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
168f0 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  a columns needed
16900 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74   */.  char *zExt
16910 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
16920 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
16930 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20  space after the 
16940 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  Index object */.
16950 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
16960 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52  ;      /* PRIMAR
16970 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20  Y KEY index for 
16980 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
16990 62 6c 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  bles */..  asser
169a0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
169b0 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65  =0 );      /* Ne
169c0 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
169d0 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  prior errors */.
169e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
169f0 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43  Failed || IN_DEC
16a00 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20  LARE_VTAB ){.   
16a10 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
16a20 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
16a30 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
16a40 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
16a50 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
16a60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
16a70 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
16a80 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
16a90 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
16aa0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
16ab0 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
16ac0 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
16ad0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
16ae0 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
16af0 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
16b00 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
16b10 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
16b20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
16b30 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
16b40 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
16b50 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
16b60 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
16b70 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
16b80 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
16b90 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
16ba0 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
16bb0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
16bc0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
16bd0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
16be0 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
16bf0 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
16c00 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
16c10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
16c20 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20  ame && pName->z 
16c30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
16c40 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
16c50 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
16c60 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
16c70 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
16c80 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  f the table.    
16c90 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
16ca0 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
16cb0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
16cc0 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  . Do not do this
16cd0 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69  .    ** if initi
16ce0 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61  alising a databa
16cf0 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a  se schema..    *
16d00 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  /.    if( !db->i
16d10 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
16d20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
16d30 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
16d40 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
16d50 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
16d60 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
16d70 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
16d80 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
16d90 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
16da0 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  iDb = 1;.      }
16db0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
16dc0 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69     sqlite3FixIni
16dd0 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
16de0 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
16df0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73  Name);.    if( s
16e00 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
16e10 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
16e20 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65  ) ){.      /* Be
16e30 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
16e40 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
16e50 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
16e60 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
16e70 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
16e80 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
16e90 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
16ea0 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
16eb0 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
16ec0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
16ed0 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
16ee0 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d   &pTblName->a[0]
16ef0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
16f00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
16f10 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b  =0 || pTab==0 );
16f20 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
16f30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
16f40 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
16f50 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d  f( iDb==1 && db-
16f60 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
16f70 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a!=pTab->pSchema
16f80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16f90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16fa0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63  , .           "c
16fb0 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54  annot create a T
16fc0 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e  EMP index on non
16fd0 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73  -TEMP table \"%s
16fe0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
16ff0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
17000 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
17010 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
17020 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  }.    if( !HasRo
17030 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20  wid(pTab) ) pPk 
17040 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
17050 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
17060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
17070 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
17080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
17090 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  art==0 );.    pT
170a0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
170b0 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
170c0 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
170d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
170e0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
170f0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
17100 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
17110 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
17120 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
17130 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
17140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17150 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
17160 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
17170 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
17180 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
17190 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
171a0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
171b0 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c  &pTab->zName[7],
171c0 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d  "altertab_",9)!=
171d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
171e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
171f0 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
17200 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
17210 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
17220 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
17230 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  te_index;.  }.#i
17240 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17250 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
17260 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
17270 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17280 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
17290 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
172a0 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
172b0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
172c0 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  x;.  }.#endif.#i
172d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
172e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
172f0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
17300 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
17310 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17320 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62  se, "virtual tab
17330 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  les may not be i
17340 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
17350 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17360 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
17370 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
17380 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
17390 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
173a0 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
173b0 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
173c0 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
173d0 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
173e0 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
173f0 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
17400 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
17410 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
17420 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
17430 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
17440 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
17450 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
17460 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
17470 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
17480 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
17490 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
174a0 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
174b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
174c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
174d0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
174e0 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
174f0 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
17500 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
17510 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
17520 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
17530 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
17540 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
17550 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
17560 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
17570 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
17580 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
17590 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
175a0 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
175b0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
175c0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
175d0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
175e0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
175f0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17600 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
17610 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  >z!=0 );.    if(
17620 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
17630 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
17640 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
17650 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
17660 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17670 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
17680 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
17690 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
176a0 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
176b0 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29  , zName, 0)!=0 )
176c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
176d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
176e0 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
176f0 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
17700 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
17710 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
17720 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17730 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17740 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
17750 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
17760 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20   pDb->zName)!=0 
17770 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66  ){.      if( !if
17780 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20  NotExist ){.    
17790 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
177a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
177b0 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
177c0 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
177d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
177e0 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
177f0 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
17800 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
17810 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
17820 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
17830 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
17840 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17850 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
17860 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
17870 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
17880 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
17890 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
178a0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
178b0 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
178c0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
178d0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
178e0 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
178f0 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e  x_%s_%d", pTab->
17900 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69  zName, n);.    i
17910 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
17920 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
17930 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
17940 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
17950 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
17960 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
17970 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
17980 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17990 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
179a0 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
179b0 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a  ar *zDb = pDb->z
179c0 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
179d0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
179e0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
179f0 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
17a00 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29  LE(iDb), 0, zDb)
17a10 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
17a20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
17a40 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
17a50 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  DEX;.    if( !OM
17a60 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
17a70 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45  ==1 ) i = SQLITE
17a80 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
17a90 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
17aa0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
17ab0 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
17ac0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
17ad0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
17ae0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
17b00 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
17b10 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
17b20 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
17b30 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
17b40 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
17b50 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
17b60 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
17b70 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
17b80 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
17b90 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
17ba0 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
17bb0 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
17bc0 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
17bd0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
17be0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
17bf0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
17c00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69   0);.    if( pLi
17c10 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
17c20 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17c30 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
17c40 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
17c50 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
17c60 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c80 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
17c90 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
17ca0 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l-1].zName);.   
17cb0 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
17cc0 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f 72  tOrder = (u8)sor
17cd0 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  tOrder;.  }..  /
17ce0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
17cf0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73   many bytes of s
17d00 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65  pace are require
17d10 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69  d to store expli
17d20 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69  citly.  ** speci
17d30 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  fied collation s
17d40 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20  equence names.. 
17d50 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
17d60 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
17d70 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
17d80 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
17d90 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
17da0 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ( pExpr ){.     
17db0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
17dc0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
17dd0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  ;.      nExtra +
17de0 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74  = (1 + sqlite3St
17df0 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
17e00 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a  zToken));.    }.
17e10 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
17e20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
17e30 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
17e40 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   */.  nName = sq
17e50 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
17e60 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f  ame);.  nExtraCo
17e70 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e  l = pPk ? pPk->n
17e80 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49  KeyCol : 1;.  pI
17e90 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  ndex = sqlite3Al
17ea0 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
17eb0 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t(db, pList->nEx
17ec0 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a  pr + nExtraCol,.
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ef0 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45        nName + nE
17f00 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72  xtra + 1, &zExtr
17f10 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  a);.  if( db->ma
17f20 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
17f30 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
17f40 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
17f50 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
17f60 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
17f70 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 29 20 29  dex->aiRowEst) )
17f80 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
17f90 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
17fa0 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29  (pIndex->azColl)
17fb0 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e   );.  pIndex->zN
17fc0 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  ame = zExtra;.  
17fd0 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20  zExtra += nName 
17fe0 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49  + 1;.  memcpy(pI
17ff0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
18000 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
18010 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
18020 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
18030 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f  >onError = (u8)o
18040 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
18050 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
18060 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
18070 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
18080 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70 4e 61  Index = (u8)(pNa
18090 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78  me==0);.  pIndex
180a0 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
180b0 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
180c0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ;.  pIndex->nKey
180d0 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Col = pList->nEx
180e0 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65  pr;.  if( pPIWhe
180f0 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  re ){.    sqlite
18100 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
18110 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54  rence(pParse, pT
18120 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20  ab, NC_PartIdx, 
18130 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  pPIWhere, 0);.  
18140 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49    pIndex->pPartI
18150 64 78 57 68 65 72 65 20 3d 20 70 50 49 57 68 65  dxWhere = pPIWhe
18160 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65  re;.    pPIWhere
18170 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
18180 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
18190 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
181a0 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  Db, 0) );..  /* 
181b0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
181c0 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20  we should honor 
181d0 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e  DESC requests on
181e0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20   index columns. 
181f0 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70   */.  if( pDb->p
18200 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
18210 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f  mat>=4 ){.    so
18220 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31  rtOrderMask = -1
18230 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53  ;   /* Honor DES
18240 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  C */.  }else{.  
18250 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
18260 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72  = 0;    /* Ignor
18270 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20  e DESC */.  }.. 
18280 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
18290 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
182a0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
182b0 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
182c0 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
182d0 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
182e0 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
182f0 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
18300 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
18310 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
18320 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20  ot found..  **. 
18330 20 2a 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61   ** TODO:  Add a
18340 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   test to make su
18350 72 65 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  re that the same
18360 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e   column is not n
18370 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74  amed.  ** more t
18380 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20  han once within 
18390 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20  the same index. 
183a0 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
183b0 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a  instance of.  **
183c0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c   the column will
183d0 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79   ever be used by
183e0 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
183f0 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67   Note that using
18400 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63   the.  ** same c
18410 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20  olumn more than 
18420 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61  once cannot be a
18430 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
18440 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  that would .  **
18450 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73   break backwards
18460 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
18470 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
18480 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  a warning..  */.
18490 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
184a0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
184b0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
184c0 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
184d0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
184e0 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69   *zColName = pLi
184f0 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  stItem->zName;. 
18500 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64     int requested
18510 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63  SortOrder;.    c
18520 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18540 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
18550 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20  nce name */..   
18560 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f   for(j=0, pTabCo
18570 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c  l=pTab->aCol; j<
18580 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
18590 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
185a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
185b0 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20  rICmp(zColName, 
185c0 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d  pTabCol->zName)=
185d0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
185e0 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
185f0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
18600 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18610 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
18620 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  %s has no column
18630 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20   named %s",.    
18640 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
18650 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   zColName);.    
18660 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
18670 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
18680 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18690 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
186a0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
186b0 3e 6e 43 6f 6c 3c 3d 30 78 37 66 66 66 20 26 26  >nCol<=0x7fff &&
186c0 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20   j<=0x7fff );.  
186d0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
186e0 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a  mn[i] = (i16)j;.
186f0 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65      if( pListIte
18700 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20 20 20  m->pExpr ){.    
18710 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20    int nColl;.   
18720 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
18730 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Item->pExpr->op=
18740 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20  =TK_COLLATE );. 
18750 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69       zColl = pLi
18760 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75  stItem->pExpr->u
18770 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e  .zToken;.      n
18780 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  Coll = sqlite3St
18790 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20  rlen30(zColl) + 
187a0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
187b0 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29   nExtra>=nColl )
187c0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
187d0 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43  Extra, zColl, nC
187e0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  oll);.      zCol
187f0 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20  l = zExtra;.    
18800 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c    zExtra += nCol
18810 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  l;.      nExtra 
18820 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65  -= nColl;.    }e
18830 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  lse{.      zColl
18840 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
18850 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66  .zColl;.      if
18860 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c  ( !zColl ) zColl
18870 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
18880 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
18890 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
188a0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
188b0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
188c0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
188d0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
188e0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
188f0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
18900 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75   zColl;.    requ
18910 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d  estedSortOrder =
18920 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74   pListItem->sort
18930 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65  Order & sortOrde
18940 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65  rMask;.    pInde
18950 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
18960 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64   = (u8)requested
18970 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69  SortOrder;.    i
18980 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  f( pTab->aCol[j]
18990 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 70 49  .notNull==0 ) pI
189a0 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
189b0 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  l = 0;.  }.  if(
189c0 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28   pPk ){.    for(
189d0 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79  j=0; j<pPk->nKey
189e0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
189f0 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69   int x = pPk->ai
18a00 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
18a10 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70   if( hasColumn(p
18a20 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  Index->aiColumn,
18a30 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
18a40 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , x) ){.        
18a50 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  pIndex->nColumn-
18a60 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -; .      }else{
18a70 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
18a80 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78  >aiColumn[i] = x
18a90 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
18aa0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50  ->azColl[i] = pP
18ab0 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  k->azColl[j];.  
18ac0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53        pIndex->aS
18ad0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50  ortOrder[i] = pP
18ae0 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  k->aSortOrder[j]
18af0 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  ;.        i++;. 
18b00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18b10 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64   assert( i==pInd
18b20 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  ex->nColumn );. 
18b30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64   }else{.    pInd
18b40 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
18b50 3d 20 2d 31 3b 0a 20 20 20 20 70 49 6e 64 65 78  = -1;.    pIndex
18b60 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 22 42  ->azColl[i] = "B
18b70 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 20 20 73 71  INARY";.  }.  sq
18b80 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
18b90 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66  st(pIndex);.  if
18ba0 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
18bb0 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74  ble==0 ) estimat
18bc0 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64  eIndexWidth(pInd
18bd0 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  ex);..  if( pTab
18be0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
18bf0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
18c00 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
18c10 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
18c20 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
18c30 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
18c40 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
18c50 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
18c60 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
18c70 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
18c80 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
18c90 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
18ca0 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
18cb0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
18cc0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
18cd0 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
18ce0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
18cf0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
18d00 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
18d10 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
18d20 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
18d30 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
18d40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
18d50 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
18d60 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
18d70 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
18d80 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
18d90 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
18da0 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
18db0 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
18dc0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
18dd0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
18de0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
18df0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
18e00 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
18e10 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
18e20 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
18e30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f     **.    ** Two
18e40 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
18e50 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
18e60 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ts are considere
18e70 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  d equivalent.   
18e80 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75   ** (and thus su
18e90 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65  ppressing the se
18ea0 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69  cond one) even i
18eb0 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66  f they have diff
18ec0 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72  erent.    ** sor
18ed0 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a  t orders..    **
18ee0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
18ef0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63   are different c
18f00 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
18f10 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c  es or if the col
18f20 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  umns of.    ** t
18f30 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63  he constraint oc
18f40 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74  cur in different
18f50 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68   orders, then th
18f60 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
18f70 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  e.    ** conside
18f80 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64  red distinct and
18f90 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20   both result in 
18fa0 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
18fb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
18fc0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
18fd0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
18fe0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
18ff0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
19000 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
19010 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f   assert( pIdx->o
19020 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
19030 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19040 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78   pIdx->autoIndex
19050 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
19060 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
19070 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20  r!=OE_None );.. 
19080 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
19090 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e  KeyCol!=pIndex->
190a0 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e  nKeyCol ) contin
190b0 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  ue;.      for(k=
190c0 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; k<pIdx->nKeyC
190d0 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; k++){.      
190e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
190f0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
19100 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20  char *z2;.      
19110 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
19120 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
19130 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
19140 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31  reak;.        z1
19150 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
19160 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  k];.        z2 =
19170 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
19180 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
19190 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65  z1!=z2 && sqlite
191a0 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
191b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
191c0 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
191d0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  Idx->nKeyCol ){.
191e0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
191f0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
19200 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
19210 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
19220 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
19230 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
19240 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
19250 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
19260 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
19270 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
19280 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
19290 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
192a0 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
192b0 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
192c0 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
192d0 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
192e0 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
192f0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
19300 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
19310 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
19320 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
19330 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
19340 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
19350 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
19360 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
19370 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
19380 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
19390 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
193a0 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
193b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
193c0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
193d0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
193e0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
193f0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
19400 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
19410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19420 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
19430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19440 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
19450 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
19460 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
19470 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
19480 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
19490 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
194a0 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
194b0 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
194c0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
194d0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
194e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
194f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19500 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
19520 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
19530 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
19540 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
19550 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
19560 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
19570 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
19580 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  s. .  */.  if( d
19590 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
195a0 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
195b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
195c0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
195d0 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  (db, 0, pIndex->
195e0 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
195f0 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
19600 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
19610 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
19620 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19630 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
19640 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  ex->zName, sqlit
19650 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64 65  e3Strlen30(pInde
19660 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  x->zName),.     
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19680 20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a 20 20       pIndex);.  
19690 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
196a0 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
196b0 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
196c0 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
196d0 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d  d */.      db->m
196e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
196f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
19700 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19710 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
19720 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
19730 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
19740 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
19750 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
19760 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
19770 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a  .newTnum;.    }.
19780 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
19790 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
197a0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
197b0 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41  atement (or CREA
197c0 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a  TE TABLE if the.
197d0 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e    ** index is an
197e0 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66   implied index f
197f0 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50  or a UNIQUE or P
19800 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
19810 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a  raint) then.  **
19820 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c   emit code to al
19830 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
19840 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73   rootpage on dis
19850 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e  k and make an en
19860 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  try for.  ** the
19870 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71   index in the sq
19880 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
19890 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  e and populate t
198a0 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20  he index with.  
198b0 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74  ** content.  But
198c0 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  , do not do this
198d0 20 69 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c   if we are simpl
198e0 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  y reading the sq
198f0 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
19900 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20   table to parse 
19910 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69  the schema, or i
19920 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
19930 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
19940 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20  index.  ** of a 
19950 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
19960 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
19970 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
19980 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
19990 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
199a0 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49  s an implied PRI
199b0 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72  MARY KEY.  ** or
199c0 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e   UNIQUE index in
199d0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
199e0 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
199f0 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
19a00 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
19a10 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
19a20 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
19a30 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
19a40 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
19a50 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
19a60 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
19a70 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
19a80 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28  =0 && (HasRowid(
19a90 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d  pTab) || pTblNam
19aa0 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 56 64 62  e!=0) ){.    Vdb
19ab0 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
19ac0 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  zStmt;.    int i
19ad0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
19ae0 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73  nMem;..    v = s
19af0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
19b00 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
19b10 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
19b20 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a  create_index;...
19b30 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
19b40 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
19b50 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a  he index.    */.
19b60 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
19b70 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
19b80 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
19b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19ba0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp2(v, OP_Crea
19bb0 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d  teIndex, iDb, iM
19bc0 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74  em);..    /* Gat
19bd0 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
19be0 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
19bf0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
19c00 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  ent into.    ** 
19c10 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
19c20 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  le.    */.    if
19c30 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
19c40 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28    int n = (int)(
19c50 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
19c60 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29  en.z - pName->z)
19c70 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   + pParse->sLast
19c80 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69  Token.n;.      i
19c90 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d  f( pName->z[n-1]
19ca0 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20  ==';' ) n--;.   
19cb0 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
19cc0 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
19cd0 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
19ce0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
19cf0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
19d00 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
19d10 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
19d20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f  %.*s",.        o
19d30 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
19d40 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
19d50 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  , n, pName->z);.
19d60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19d70 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
19d80 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
19d90 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
19da0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
19db0 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
19dc0 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
19dd0 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
19de0 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
19df0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
19e00 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
19e10 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
19e20 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
19e30 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
19e40 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
19e50 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
19e60 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
19e70 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
19e80 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20  %Q,#%d,%Q);",.  
19e90 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
19ea0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
19eb0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
19ec0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
19ed0 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
19ee0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
19ef0 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a   iMem,.        z
19f00 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
19f10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19f20 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  , zStmt);..    /
19f30 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
19f40 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
19f50 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
19f60 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
19f70 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69  pire.    ** to i
19f80 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
19f90 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
19fa0 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
19fb0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
19fc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
19fd0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
19fe0 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
19ff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
1a000 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1a010 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1a020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
1a030 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
1a040 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  Db,.         sql
1a050 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1a060 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74  "name='%q' AND t
1a070 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49  ype='index'", pI
1a080 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ndex->zName));. 
1a090 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a0a0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70  AddOp1(v, OP_Exp
1a0b0 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ire, 0);.    }. 
1a0c0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
1a0d0 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
1a0e0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
1a0f0 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
1a100 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
1a110 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
1a120 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
1a130 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
1a140 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
1a150 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
1a160 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
1a170 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
1a180 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b  constraint check
1a190 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
1a1a0 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65   (in sqlite3Gene
1a1b0 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
1a1c0 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20  ecks()) as part 
1a1d0 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61  of.  ** UPDATE a
1a1e0 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  nd INSERT statem
1a1f0 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  ents.  .  */.  i
1a200 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1a210 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
1a220 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
1a230 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
1a240 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
1a250 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
1a260 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
1a270 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
1a280 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
1a290 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
1a2a0 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
1a2b0 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
1a2c0 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
1a2d0 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
1a2e0 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
1a2f0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1a300 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
1a310 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
1a320 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
1a330 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
1a340 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
1a350 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1a360 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1a370 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
1a380 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
1a390 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
1a3a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74 20  .    }.    pRet 
1a3b0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49  = pIndex;.    pI
1a3c0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
1a3d0 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
1a3e0 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
1a3f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a400 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
1a410 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70   freeIndex(db, p
1a420 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  Index);.  sqlite
1a430 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1a440 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c  pPIWhere);.  sql
1a450 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
1a460 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1a470 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1a480 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61  elete(db, pTblNa
1a490 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
1a4a0 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
1a4b0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
1a4c0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68  }../*.** Fill th
1a4d0 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  e Index.aiRowEst
1a4e0 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65  [] array with de
1a4f0 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f  fault informatio
1a500 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  n - information.
1a510 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  ** to be used wh
1a520 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72  en we have not r
1a530 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63  un the ANALYZE c
1a540 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69  ommand..**.** ai
1a550 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70  RowEst[0] is sup
1a560 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pose to contain 
1a570 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1a580 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
1a590 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
1a5a0 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
1a5b0 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
1a5c0 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
1a5d0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1a5e0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
1a5f0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1a600 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
1a610 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
1a620 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
1a630 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1a640 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
1a650 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
1a660 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
1a670 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
1a680 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
1a690 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f  ular combiniatio
1a6a0 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32  n of the first 2
1a6b0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
1a6c0 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73  he index.  And s
1a6d0 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73  o forth.  It mus
1a6e0 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  t always be the 
1a6f0 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20  case that.*.**  
1a700 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1a710 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e  t[N]<=aiRowEst[N
1a720 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  -1].**          
1a730 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a   aiRowEst[N]>=1.
1a740 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d  **.** Apart from
1a750 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c   that, we have l
1a760 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62  ittle to go on b
1a770 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e  esides intuition
1a780 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69   as to.** how ai
1a790 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20  RowEst[] should 
1a7a0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
1a7b0 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e   The numbers gen
1a7c0 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61  erated here.** a
1a7d0 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69  re based on typi
1a7e0 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64  cal values found
1a7f0 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63   in actual indic
1a800 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1a810 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
1a820 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
1a830 20 74 52 6f 77 63 6e 74 20 2a 61 20 3d 20 70 49   tRowcnt *a = pI
1a840 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20  dx->aiRowEst;.  
1a850 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e 74  int i;.  tRowcnt
1a860 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21   n;.  assert( a!
1a870 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  =0 );.  a[0] = p
1a880 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f  Idx->pTable->nRo
1a890 77 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d  wEst;.  if( a[0]
1a8a0 3c 31 30 20 29 20 61 5b 30 5d 20 3d 20 31 30 3b  <10 ) a[0] = 10;
1a8b0 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72  .  n = 10;.  for
1a8c0 28 69 3d 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e  (i=1; i<=pIdx->n
1a8d0 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
1a8e0 20 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20 20 20    a[i] = n;.    
1a8f0 69 66 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b 0a 20  if( n>5 ) n--;. 
1a900 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f   }.  if( pIdx->o
1a910 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
1a920 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e  ){.    a[pIdx->n
1a930 4b 65 79 43 6f 6c 5d 20 3d 20 31 3b 0a 20 20 7d  KeyCol] = 1;.  }
1a940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1a950 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
1a960 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
1a970 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
1a980 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
1a990 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
1a9a0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
1a9b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
1a9c0 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
1a9d0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1a9e0 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78  *pName, int ifEx
1a9f0 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a  ists){.  Index *
1aa00 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
1aa10 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
1aa20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1aa30 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73   int iDb;..  ass
1aa40 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1aa50 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76  r==0 );   /* Nev
1aa60 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  er called with p
1aa70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  rior errors */. 
1aa80 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1aa90 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1aaa0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1aab0 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
1aac0 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
1aad0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1aae0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
1aaf0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
1ab00 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1ab10 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1ab20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
1ab30 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70  3FindIndex(db, p
1ab40 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
1ab50 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
1ab60 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
1ab70 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20  pIndex==0 ){.   
1ab80 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29   if( !ifExists )
1ab90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1aba0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1abb0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
1abc0 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
1abd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1abe0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1abf0 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
1ac00 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
1ac10 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1ac20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
1ac30 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
1ac40 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1ac50 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1ac60 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74   if( pIndex->aut
1ac70 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  oIndex ){.    sq
1ac80 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ac90 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73  arse, "index ass
1aca0 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49  ociated with UNI
1acb0 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20  QUE ".      "or 
1acc0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1acd0 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
1ace0 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20   dropped", 0);. 
1acf0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1ad00 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
1ad10 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
1ad20 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
1ad30 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
1ad40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ad50 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
1ad60 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
1ad70 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
1ad80 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c  _INDEX;.    Tabl
1ad90 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
1ada0 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f  ->pTable;.    co
1adb0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
1adc0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1add0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
1ade0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
1adf0 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
1ae00 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1ae10 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1ae20 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
1ae30 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
1ae40 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
1ae50 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
1ae60 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
1ae70 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63  EMPDB && iDb ) c
1ae80 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1ae90 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
1aea0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1aeb0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
1aec0 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
1aed0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
1aee0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1aef0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1af00 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
1af10 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
1af20 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
1af30 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
1af40 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
1af50 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
1af60 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1af70 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
1af80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1af90 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1afa0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
1afb0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e  b);.    sqlite3N
1afc0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1afd0 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
1afe0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
1aff0 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74  RE name=%Q AND t
1b000 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20  ype='index'",.  
1b010 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1b020 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
1b030 54 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64  TABLE(iDb), pInd
1b040 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ex->zName.    );
1b050 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61  .    sqlite3Clea
1b060 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72  rStatTables(pPar
1b070 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20  se, iDb, "idx", 
1b080 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  pIndex->zName);.
1b090 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
1b0a0 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
1b0b0 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f  iDb);.    destro
1b0c0 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
1b0d0 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
1b0e0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
1b0f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1b100 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62  P_DropIndex, iDb
1b110 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  , 0, 0, pIndex->
1b120 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
1b130 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
1b140 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
1b150 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
1b160 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72  e);.}../*.** pAr
1b170 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
1b180 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
1b190 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62  objects. Each ob
1b1a0 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61  ject in the.** a
1b1b0 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20  rray is szEntry 
1b1c0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54  bytes in size. T
1b1d0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73  his routine uses
1b1e0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1b1f0 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64  c().** to extend
1b200 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74 68   the array so th
1b210 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61 63  at there is spac
1b220 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65  e for a new obje
1b230 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a  ct at the end..*
1b240 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
1b250 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1b260 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74  d, *pnEntry cont
1b270 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  ains the current
1b280 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20   size of.** the 
1b290 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65  array (in entrie
1b2a0 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63  s - so the alloc
1b2b0 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e  ation is ((*pnEn
1b2c0 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20  try) * szEntry) 
1b2d0 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61  bytes.** in tota
1b2e0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
1b2f0 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75   realloc() is su
1b300 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69  ccessful (i.e. i
1b310 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f no OOM conditi
1b320 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a  on occurs), the.
1b330 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  ** space allocat
1b340 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f  ed for the new o
1b350 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c  bject is zeroed,
1b360 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65   *pnEntry update
1b370 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20  d to.** reflect 
1b380 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20  the new size of 
1b390 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61 20  the array and a 
1b3a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
1b3b0 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ew allocation.**
1b3c0 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78   returned. *pIdx
1b3d0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
1b3e0 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20  ndex of the new 
1b3f0 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74  array entry in t
1b400 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
1b410 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1b420 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c  e realloc() fail
1b430 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74 20  s, *pIdx is set 
1b440 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20  to -1, *pnEntry 
1b450 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61  remains.** uncha
1b460 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20  nged and a copy 
1b470 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72 6e  of pArray return
1b480 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ed..*/.void *sql
1b490 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1b4a0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1b4b0 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ,      /* Connec
1b4c0 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1b4d0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
1b4e0 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  s */.  void *pAr
1b4f0 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61  ray,     /* Arra
1b500 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d  y of objects.  M
1b510 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61  ight be realloca
1b520 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45  ted */.  int szE
1b530 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69  ntry,      /* Si
1b540 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63  ze of each objec
1b550 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a  t in the array *
1b560 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79  /.  int *pnEntry
1b570 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
1b580 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65  of objects curre
1b590 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ntly in use */. 
1b5a0 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20   int *pIdx      
1b5b0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1b5c0 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73  index of a new s
1b5d0 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lot here */.){. 
1b5e0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20   char *z;.  int 
1b5f0 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  n = *pnEntry;.  
1b600 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d  if( (n & (n-1))=
1b610 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  =0 ){.    int sz
1b620 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20   = (n==0) ? 1 : 
1b630 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  2*n;.    void *p
1b640 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
1b650 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61  ealloc(db, pArra
1b660 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a  y, sz*szEntry);.
1b670 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1b680 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  ){.      *pIdx =
1b690 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
1b6a0 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a  n pArray;.    }.
1b6b0 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65      pArray = pNe
1b6c0 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68  w;.  }.  z = (ch
1b6d0 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65  ar*)pArray;.  me
1b6e0 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e  mset(&z[n * szEn
1b6f0 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79  try], 0, szEntry
1b700 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a  );.  *pIdx = n;.
1b710 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20    ++*pnEntry;.  
1b720 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d  return pArray;.}
1b730 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1b740 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1b750 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74  the given IdList
1b760 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
1b770 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  IdList if.** nee
1b780 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  d be..**.** A ne
1b790 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75  w IdList is retu
1b7a0 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
1b7b0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
1b7c0 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  .*/.IdList *sqli
1b7d0 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
1b7e0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
1b7f0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
1b800 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e  n *pToken){.  in
1b810 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1b820 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
1b830 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1b840 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
1b850 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20  f(IdList) );.   
1b860 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1b870 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1b880 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
1b890 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
1b8a0 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20  .      db,.     
1b8b0 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20   pList->a,.     
1b8c0 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
1b8d0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69  [0]),.      &pLi
1b8e0 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26  st->nId,.      &
1b8f0 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30  i.  );.  if( i<0
1b900 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
1b910 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1b920 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
1b930 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
1b940 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
1b950 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1b960 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
1b970 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
1b980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
1b990 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
1b9a0 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
1b9b0 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
1b9c0 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
1b9d0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1b9e0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1b9f0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1ba00 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
1ba10 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1ba20 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
1ba30 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
1ba40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
1ba50 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1ba60 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
1ba70 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
1ba80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ba90 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
1baa0 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
1bab0 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
1bac0 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
1bad0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
1bae0 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
1baf0 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
1bb00 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
1bb10 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
1bb20 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1bb30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1bb40 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1bb50 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
1bb60 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1bb70 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
1bb80 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
1bb90 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
1bba0 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
1bbb0 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68  ./*.** Expand th
1bbc0 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
1bbd0 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
1bbe0 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62  SrcList object b
1bbf0 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45  y.** creating nE
1bc00 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62  xtra new slots b
1bc10 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61  eginning at iSta
1bc20 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a  rt.  iStart is z
1bc30 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65  ero based..** Ne
1bc40 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f  w slots are zero
1bc50 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
1bc60 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61  ample, suppose a
1bc70 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c   SrcList initial
1bc80 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20  ly contains two 
1bc90 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a  entries: A,B..**
1bca0 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77   To append 3 new
1bcb0 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68   entries onto th
1bcc0 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a  e end, do this:.
1bcd0 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  **.**    sqlite3
1bce0 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
1bcf0 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20  b, pSrclist, 3, 
1bd00 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  2);.**.** After 
1bd10 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69  the call above i
1bd20 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a  t would contain:
1bd30 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c    A, B, nil, nil
1bd40 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  , nil..** If the
1bd50 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74   iStart argument
1bd60 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74   had been 1 inst
1bd70 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74  ead of 2, then t
1bd80 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75  he result.** wou
1bd90 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41  ld have been:  A
1bda0 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  , nil, nil, nil,
1bdb0 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20   B.  To prepend 
1bdc0 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a  the new slots,.*
1bdd0 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c  * the iStart val
1bde0 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20  ue would be 0.  
1bdf0 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20  The result then 
1be00 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c  would.** be: nil
1be10 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42  , nil, nil, A, B
1be20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
1be30 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
1be40 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74  ails the SrcList
1be50 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20   is unchanged.  
1be60 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f  The.** db->mallo
1be70 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c  cFailed flag wil
1be80 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65  l be set to true
1be90 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1bea0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1beb0 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  rge(.  sqlite3 *
1bec0 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db,       /* Dat
1bed0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1bee0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f   to notify of OO
1bef0 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72  M errors */.  Sr
1bf00 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
1bf10 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20   /* The SrcList 
1bf20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a  to be enlarged *
1bf30 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
1bf40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1bf50 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f   of new slots to
1bf60 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b   add to pSrc->a[
1bf70 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  ] */.  int iStar
1bf80 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  t         /* Ind
1bf90 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  ex in pSrc->a[] 
1bfa0 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f  of first new slo
1bfb0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
1bfc0 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
1bfd0 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e  ecking on callin
1bfe0 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
1bff0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
1c000 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1c010 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20   nExtra>=1 );.  
1c020 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
1c030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1c040 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20  art<=pSrc->nSrc 
1c050 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
1c060 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61  e additional spa
1c070 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  ce if needed */.
1c080 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
1c090 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41  +nExtra>pSrc->nA
1c0a0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
1c0b0 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ist *pNew;.    i
1c0c0 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63  nt nAlloc = pSrc
1c0d0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
1c0e0 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
1c0f0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
1c100 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
1c110 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
1c120 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
1c130 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
1c140 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
1c150 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1c160 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1c170 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1c180 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
1c190 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
1c1a0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
1c1b0 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
1c1c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
1c1d0 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
1c1e0 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
1c1f0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
1c200 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
1c210 6c 6f 63 20 3d 20 28 75 38 29 6e 47 6f 74 3b 0a  loc = (u8)nGot;.
1c220 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
1c230 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
1c240 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
1c250 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
1c260 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
1c270 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
1c280 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1c290 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
1c2a0 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
1c2b0 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
1c2c0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
1c2d0 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69 38  Src->nSrc += (i8
1c2e0 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a  )nExtra;..  /* Z
1c2f0 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c  ero the newly al
1c300 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f  located slots */
1c310 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d  .  memset(&pSrc-
1c320 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73  >a[iStart], 0, s
1c330 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1c340 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72  )*nExtra);.  for
1c350 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74  (i=iStart; i<iSt
1c360 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29  art+nExtra; i++)
1c370 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d  {.    pSrc->a[i]
1c380 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
1c390 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
1c3a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1c3b0 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73   enlarged SrcLis
1c3c0 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53  t */.  return pS
1c3d0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70  rc;.}.../*.** Ap
1c3e0 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
1c3f0 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
1c400 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
1c410 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
1c420 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1c430 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
1c440 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1c450 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
1c460 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a  pTable is NULL..
1c470 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20  **.** A SrcList 
1c480 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1c490 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
1c4a0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
1c4b0 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  The returned.** 
1c4c0 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65  SrcList might be
1c4d0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1c4e0 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77 61   SrcList that wa
1c4f0 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69  s input or it mi
1c500 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20  ght be.** a new 
1c510 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20  one.  If an OOM 
1c520 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
1c530 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f  s, then the prio
1c540 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74  r value of pList
1c550 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75  .** that is inpu
1c560 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
1c570 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  e is automatical
1c580 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
1c590 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
1c5a0 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
1c5b0 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
1c5c0 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
1c5d0 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
1c5e0 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
1c5f0 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
1c600 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
1c610 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
1c620 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
1c630 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
1c640 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
1c650 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
1c660 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
1c670 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
1c680 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
1c690 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
1c6a0 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
1c6b0 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
1c6c0 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
1c6d0 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
1c6e0 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
1c6f0 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
1c700 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
1c710 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
1c720 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
1c730 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
1c740 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
1c750 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
1c760 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
1c770 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
1c780 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1c790 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1c7a0 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
1c7b0 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
1c7c0 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
1c7d0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1c7e0 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
1c7f0 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
1c800 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
1c810 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1c820 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1c830 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,B,C);.**.
1c840 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65  ** Then C is the
1c850 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1c860 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  B is the databas
1c870 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73  e name.  If C is
1c880 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e   defined.** then
1c890 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74   so is B.  In ot
1c8a0 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65  her words, we ne
1c8b0 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65 20  ver have a case 
1c8c0 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  where:.**.**    
1c8d0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1c8e0 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c  istAppend(D,A,0,
1c8f0 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70  C);.**.** Both p
1c900 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
1c910 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64 20  ase are assumed 
1c920 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54  to be quoted.  T
1c930 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65 64  hey are dequoted
1c940 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67  .** before being
1c950 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53 72   added to the Sr
1c960 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73  cList..*/.SrcLis
1c970 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1c980 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74  tAppend(.  sqlit
1c990 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
1c9a0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
1c9b0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
1c9c0 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53   failures */.  S
1c9d0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  rcList *pList,  
1c9e0 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
1c9f0 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55  this SrcList. NU
1ca00 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  LL creates a new
1ca10 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f   SrcList */.  To
1ca20 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
1ca30 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70    /* Table to ap
1ca40 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pend */.  Token 
1ca50 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a  *pDatabase    /*
1ca60 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65   Database of the
1ca70 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
1ca80 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1ca90 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
1caa0 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d  ert( pDatabase==
1cab0 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29  0 || pTable!=0 )
1cac0 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76  ;  /* Cannot hav
1cad0 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f  e C without B */
1cae0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1caf0 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1cb00 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1cb10 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  ro(db, sizeof(Sr
1cb20 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
1cb30 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1cb40 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
1cb50 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
1cb60 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  }.  pList = sqli
1cb70 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1cb80 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20  e(db, pList, 1, 
1cb90 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
1cba0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1cbb0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
1cbc0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1cbd0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1cbe0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1cbf0 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
1cc00 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
1cc10 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
1cc20 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
1cc30 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
1cc40 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
1cc50 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
1cc60 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
1cc70 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
1cc80 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1cc90 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
1cca0 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
1ccb0 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
1ccc0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1ccd0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
1cce0 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
1ccf0 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
1cd00 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1cd10 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
1cd20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1cd30 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
1cd40 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
1cd50 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
1cd60 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
1cd70 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
1cd80 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1cd90 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
1cda0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
1cdb0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1cdc0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1cdd0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1cde0 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
1cdf0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1ce00 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
1ce10 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
1ce20 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
1ce30 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
1ce40 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1ce50 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1ce60 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
1ce70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1ce80 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
1ce90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1cea0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1ceb0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1cec0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1ced0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1cee0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
1cef0 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
1cf00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1cf10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
1cf20 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
1cf30 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
1cf40 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
1cf50 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1cf60 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1cf70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
1cf80 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1cf90 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1cfa0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1cfb0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
1cfc0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1cfd0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1cfe0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
1cff0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1d000 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
1d010 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1d020 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1d030 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1d040 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
1d050 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1d060 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1d070 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1d080 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d090 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29  , pItem->zIndex)
1d0a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
1d0b0 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74  eteTable(db, pIt
1d0c0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
1d0d0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1d0e0 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  te(db, pItem->pS
1d0f0 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
1d100 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1d110 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  , pItem->pOn);. 
1d120 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1d130 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1d140 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
1d150 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d160 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1d170 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d180 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1d190 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20  e parser to add 
1d1a0 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
1d1b0 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72  e.** end of a gr
1d1c0 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73  owing FROM claus
1d1d0 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61  e.  The "p" para
1d1e0 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72  meter is the par
1d1f0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  t of.** the FROM
1d200 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73   clause that has
1d210 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1d220 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20  nstructed.  "p" 
1d230 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68  is NULL.** if th
1d240 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1d250 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
1d260 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65   clause.  pTable
1d270 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a   and pDatabase.*
1d280 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f  * are the name o
1d290 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
1d2a0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69  database named i
1d2b0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1d2c0 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61  e term..** pData
1d2d0 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20  base is NULL if 
1d2e0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1d2f0 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d  e qualifier is m
1d300 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20  issing - the.** 
1d310 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20  usual case.  If 
1d320 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20 61  the term has a a
1d330 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61  lias, then pAlia
1d340 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  s points to the.
1d350 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20  ** alias token. 
1d360 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73 20   If the term is 
1d370 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  a subquery, then
1d380 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74 68   pSubquery is th
1d390 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
1d3a0 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 73  ement that the s
1d3b0 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e  ubquery encodes.
1d3c0 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64    The pTable and
1d3d0 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70 61  .** pDatabase pa
1d3e0 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c  rameters are NUL
1d3f0 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73  L for subqueries
1d400 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70  .  The pOn and p
1d410 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74  Using.** paramet
1d420 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74  ers are the cont
1d430 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e  ent of the ON an
1d440 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e  d USING clauses.
1d450 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
1d460 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69 63  new SrcList whic
1d470 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65  h encodes is the
1d480 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e   FROM with the n
1d490 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64  ew.** term added
1d4a0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
1d4b0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1d4c0 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61  ndFromTerm(.  Pa
1d4d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1d4e0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1d4f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1d500 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20  cList *p,       
1d510 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66        /* The lef
1d520 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 52  t part of the FR
1d530 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  OM clause alread
1d540 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  y seen */.  Toke
1d550 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1d560 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1d570 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20  he table to add 
1d580 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  to the FROM clau
1d590 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
1d5a0 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20 20  Database,       
1d5b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1d5c0 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1d5d0 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54  ng pTable */.  T
1d5e0 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20  oken *pAlias,   
1d5f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
1d600 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
1d610 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72 65   the AS subexpre
1d620 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ssion */.  Selec
1d630 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20  t *pSubquery,   
1d640 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79     /* A subquery
1d650 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
1d660 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  f a table name *
1d670 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20  /.  Expr *pOn,  
1d680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d690 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20  he ON clause of 
1d6a0 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69  a join */.  IdLi
1d6b0 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20  st *pUsing      
1d6c0 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47      /* The USING
1d6d0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
1d6e0 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  n */.){.  struct
1d6f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d700 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
1d710 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1d720 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28 70  ;.  if( !p && (p
1d730 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b  On || pUsing) ){
1d740 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1d750 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
1d760 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72  JOIN clause is r
1d770 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 25  equired before %
1d780 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20  s", .      (pOn 
1d790 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22  ? "ON" : "USING"
1d7a0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74  ).    );.    got
1d7b0 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
1d7c0 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  ror;.  }.  p = s
1d7d0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1d7e0 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c  end(db, p, pTabl
1d7f0 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  e, pDatabase);. 
1d800 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
1d810 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29  ER(p->nSrc==0) )
1d820 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  {.    goto appen
1d830 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1d840 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e  }.  pItem = &p->
1d850 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1d860 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d  assert( pAlias!=
1d870 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61  0 );.  if( pAlia
1d880 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
1d890 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
1d8a0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1d8b0 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
1d8c0 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
1d8d0 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
1d8e0 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
1d8f0 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
1d900 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
1d910 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65  return p;.. appe
1d920 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20  nd_from_error:. 
1d930 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
1d940 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1d950 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20  lete(db, pOn);. 
1d960 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1d970 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
1d980 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1d990 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
1d9a0 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e  query);.  return
1d9b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
1d9c0 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f   an INDEXED BY o
1d9d0 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c  r NOT INDEXED cl
1d9e0 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74  ause to the most
1d9f0 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
1da00 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  .** element of t
1da10 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70  he source-list p
1da20 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1da30 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
1da40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1da50 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50 61  ListIndexedBy(Pa
1da60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1da70 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a  List *p, Token *
1da80 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61  pIndexedBy){.  a
1da90 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64 42  ssert( pIndexedB
1daa0 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20  y!=0 );.  if( p 
1dab0 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72  && ALWAYS(p->nSr
1dac0 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75  c>0) ){.    stru
1dad0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1dae0 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
1daf0 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
1db00 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f  ssert( pItem->no
1db10 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20 70  tIndexed==0 && p
1db20 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20  Item->zIndex==0 
1db30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
1db40 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21  xedBy->n==1 && !
1db50 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b  pIndexedBy->z ){
1db60 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54  .      /* A "NOT
1db70 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65   INDEXED" clause
1db80 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53   was supplied. S
1db90 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20  ee parse.y .    
1dba0 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22    ** construct "
1dbb0 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72  indexed_opt" for
1dbc0 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1dbd0 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64     pItem->notInd
1dbe0 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  exed = 1;.    }e
1dbf0 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d  lse{.      pItem
1dc00 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74  ->zIndex = sqlit
1dc10 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1dc20 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64  pParse->db, pInd
1dc30 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
1dc40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
1dc50 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46   building up a F
1dc60 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
1dc70 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f  e parser, the jo
1dc80 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  in operator.** i
1dc90 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61  s initially atta
1dca0 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
1dcb0 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74   operand.  But t
1dcc0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
1dcd0 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65  r.** expects the
1dce0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74   join operator t
1dcf0 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68  o be on the righ
1dd00 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  t operand.  This
1dd10 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66   routine.** Shif
1dd20 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72  ts all join oper
1dd30 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20  ators from left 
1dd40 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20  to right for an 
1dd50 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63  entire FROM.** c
1dd60 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  lause..**.** Exa
1dd70 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68  mple: Suppose th
1dd80 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74  e join is like t
1dd90 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1dda0 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63       A natural c
1ddb0 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a  ross join B.**.*
1ddc0 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69  * The operator i
1ddd0 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73  s "natural cross
1dde0 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61   join".  The A a
1ddf0 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72  nd B operands ar
1de00 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70  e stored.** in p
1de10 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b  ->a[0] and p->a[
1de20 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  1], respectively
1de30 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
1de40 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74  itially stores t
1de50 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77  he.** operator w
1de60 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75  ith A.  This rou
1de70 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61 74  tine shifts that
1de80 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74   operator over t
1de90 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  o B..*/.void sql
1dea0 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74  ite3SrcListShift
1deb0 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74  JoinType(SrcList
1dec0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
1ded0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1dee0 61 73 73 65 72 74 28 20 70 2d 3e 61 20 7c 7c 20  assert( p->a || 
1def0 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 3b 0a 20 20  p->nSrc==0 );.  
1df00 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d    for(i=p->nSrc-
1df10 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
1df20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e      p->a[i].join
1df30 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d  type = p->a[i-1]
1df40 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
1df50 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69  .    p->a[0].joi
1df60 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
1df70 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1df80 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1df90 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
1dfa0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1dfb0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
1dfc0 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
1dfd0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
1dfe0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
1dff0 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
1e000 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1e010 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
1e020 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64  !=0 );./*  if( d
1e030 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
1e040 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20   ) return; */.  
1e050 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1e060 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1e070 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1e080 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
1e090 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1e0a0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1e0b0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1e0c0 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
1e0d0 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
1e0e0 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
1e0f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
1e100 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1e110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e120 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73  dOp2(v, OP_Trans
1e130 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
1e140 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
1e150 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1e160 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
1e170 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
1e180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e190 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
1e1a0 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  mmit, 0, 0);.}..
1e1b0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
1e1c0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
1e1d0 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
1e1e0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1e1f0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
1e200 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74  be *v;..  assert
1e210 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
1e220 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1e230 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  >db!=0 );.  if( 
1e240 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1e250 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1e260 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f  TRANSACTION, "CO
1e270 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a  MMIT", 0, 0) ){.
1e280 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1e290 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1e2a0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1e2b0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
1e2c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1e2d0 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
1e2e0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 0);.  }.}../
1e2f0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
1e300 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1e310 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
1e320 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
1e330 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1e340 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
1e350 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1e360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1e370 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69  se->db!=0 );.  i
1e380 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1e390 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1e3a0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1e3b0 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
1e3c0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
1e3d0 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
1e3e0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1e3f0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1e400 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e410 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
1e420 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
1e430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1e440 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1e450 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
1e460 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61  when it parses a
1e470 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61   command to crea
1e480 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f  te,.** release o
1e490 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51  r rollback an SQ
1e4a0 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f  L savepoint. .*/
1e4b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76  .void sqlite3Sav
1e4c0 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50  epoint(Parse *pP
1e4d0 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f  arse, int op, To
1e4e0 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
1e4f0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c  har *zName = sql
1e500 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1e510 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
1e520 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
1e530 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  e ){.    Vdbe *v
1e540 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1e550 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  e(pParse);.#ifnd
1e560 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1e570 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
1e580 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1e590 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20  ar * const az[] 
1e5a0 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45  = { "BEGIN", "RE
1e5b0 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43  LEASE", "ROLLBAC
1e5c0 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  K" };.    assert
1e5d0 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  ( !SAVEPOINT_BEG
1e5e0 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  IN && SAVEPOINT_
1e5f0 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41  RELEASE==1 && SA
1e600 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1e610 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==2 );.#endif.  
1e620 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69    if( !v || sqli
1e630 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1e640 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45  rse, SQLITE_SAVE
1e650 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a  POINT, az[op], z
1e660 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Name, 0) ){.    
1e670 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1e680 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
1e690 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1e6a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1e6b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1e6c0 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f   OP_Savepoint, o
1e6d0 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20  p, 0, 0, zName, 
1e6e0 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
1e6f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1e700 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74  ure the TEMP dat
1e710 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e  abase is open an
1e720 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
1e730 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
1e740 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
1e750 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79  rors.  Leave any
1e760 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
1e770 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
1e780 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
1e790 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
1e7a0 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
1e7b0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1e7c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1e7d0 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  db;.  if( db->aD
1e7e0 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
1e7f0 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
1e800 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1e810 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20     Btree *pBt;. 
1e820 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1e830 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20  int flags = .   
1e840 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1e850 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20  EN_READWRITE |. 
1e860 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1e870 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
1e880 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1e890 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
1e8a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1e8b0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1e8c0 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
1e8d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1e8e0 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  _DB;..    rc = s
1e8f0 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
1e900 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c  db->pVfs, 0, db,
1e910 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29   &pBt, 0, flags)
1e920 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e930 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e940 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1e950 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
1e960 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
1e970 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a  rary database ".
1e980 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f          "file fo
1e990 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72  r storing tempor
1e9a0 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20  ary tables");.  
1e9b0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1e9c0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
1e9d0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 1;.    }.    d
1e9e0 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20  b->aDb[1].pBt = 
1e9f0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1ea00 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
1ea10 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53  ema );.    if( S
1ea20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c  QLITE_NOMEM==sql
1ea30 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
1ea40 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65  Size(pBt, db->ne
1ea50 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20  xtPagesize, -1, 
1ea60 30 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  0) ){.      db->
1ea70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
1ea80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1ea90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1eaa0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1eab0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
1eac0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65  ode that will ve
1ead0 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1eae0 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74  cookie and start
1eaf0 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73  .** a read-trans
1eb00 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e  action for all n
1eb10 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  amed database fi
1eb20 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  les..**.** It is
1eb30 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
1eb40 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  all schema cooki
1eb50 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61  es be verified a
1eb60 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74  nd all.** read t
1eb70 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73  ransactions be s
1eb80 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e  tarted before an
1eb90 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70  ything else happ
1eba0 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44  ens in.** the VD
1ebb0 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74  BE program.  But
1ebc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
1ebd0 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  n be called afte
1ebe0 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20  r much other.** 
1ebf0 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65  code has been ge
1ec00 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72  nerated.  So her
1ec10 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a  e is what we do:
1ec20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1ec30 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
1ec40 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
1ec50 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f   code an OP_Goto
1ec60 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75   that.** will ju
1ec70 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  mp to a subrouti
1ec80 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ne at the end of
1ec90 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54   the program.  T
1eca0 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64  hen we.** record
1ecb0 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
1ecc0 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73  that needs its s
1ecd0 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69  chema verified i
1ece0 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d  n the.** pParse-
1ecf0 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c  >cookieMask fiel
1ed00 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72  d.  Later, after
1ed10 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   all other code 
1ed20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65  has been.** gene
1ed30 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f  rated, the subro
1ed40 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20  utine that does 
1ed50 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
1ed60 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  ications and.** 
1ed70 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73  starts the trans
1ed80 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  actions will be 
1ed90 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50  coded and the OP
1eda0 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a  _Goto P2 value.*
1edb0 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  * will be made t
1edc0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  o point to that 
1edd0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
1ede0 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
1edf0 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72  he.** cookie ver
1ee00 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75  ification subrou
1ee10 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e  tine code happen
1ee20 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69  s in sqlite3Fini
1ee30 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a  shCoding()..**.*
1ee40 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20  * If iDb<0 then 
1ee50 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f  code the OP_Goto
1ee60 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65   only - don't se
1ee70 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79  t flag to verify
1ee80 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f   the.** schema o
1ee90 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e  n any databases.
1eea0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1eeb0 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74  ed to position t
1eec0 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61  he OP_Goto.** ea
1eed0 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c  rly in the code,
1eee0 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20   before we know 
1eef0 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  if any database 
1ef00 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75  tables will be u
1ef10 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
1ef20 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
1ef30 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
1ef40 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
1ef50 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1ef60 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1ef70 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1ef80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ef90 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
1efa0 69 66 28 20 70 54 6f 70 6c 65 76 65 6c 21 3d 70  if( pToplevel!=p
1efb0 50 61 72 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Parse ){.    /* 
1efc0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
1efd0 61 6b 65 6e 20 69 66 20 61 20 74 72 69 67 67 65  aken if a trigge
1efe0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62  r is currently b
1eff0 65 69 6e 67 20 63 6f 64 65 64 2e 20 49 6e 20 74  eing coded. In t
1f000 68 69 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c  his.    ** case,
1f010 20 73 65 74 20 63 6f 6f 6b 69 65 47 6f 74 6f 20   set cookieGoto 
1f020 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
1f030 6c 75 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74  lue to show that
1f040 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
1f050 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 63     ** has been c
1f060 61 6c 6c 65 64 2e 20 54 68 69 73 20 69 73 20 75  alled. This is u
1f070 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  sed by the sqlit
1f080 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61  e3ExprCodeConsta
1f090 6e 74 73 28 29 0a 20 20 20 20 2a 2a 20 66 75 6e  nts().    ** fun
1f0a0 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 50  ction. */.    pP
1f0b0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
1f0c0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69   = -1;.  }.#endi
1f0d0 66 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65  f.  if( pTopleve
1f0e0 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30  l->cookieGoto==0
1f0f0 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
1f100 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1f110 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
1f120 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
1f130 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c  rn;  /* This onl
1f140 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
1f150 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65  re was a prior e
1f160 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70  rror */.    pTop
1f170 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74  level->cookieGot
1f180 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  o = sqlite3VdbeA
1f190 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1f1a0 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20  , 0, 0)+1;.  }. 
1f1b0 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
1f1c0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1f1d0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a   pToplevel->db;.
1f1e0 20 20 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b      yDbMask mask
1f1f0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ;..    assert( i
1f200 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1f210 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1f220 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
1f230 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61   iDb==1 );.    a
1f240 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54  ssert( iDb<SQLIT
1f250 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32  E_MAX_ATTACHED+2
1f260 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1f270 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1f280 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
1f290 30 29 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d  0) );.    mask =
1f2a0 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69   ((yDbMask)1)<<i
1f2b0 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 54 6f  Db;.    if( (pTo
1f2c0 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61  plevel->cookieMa
1f2d0 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
1f2e0 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
1f2f0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20  ->cookieMask |= 
1f300 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70  mask;.      pTop
1f310 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c  level->cookieVal
1f320 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44  ue[iDb] = db->aD
1f330 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
1f340 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
1f350 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
1f360 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
1f370 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f380 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
1f390 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20  se(pToplevel);. 
1f3a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1f3b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67  .}../*.** If arg
1f3c0 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c  ument zDb is NUL
1f3d0 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c  L, then call sql
1f3e0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
1f3f0 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20  hema() for each 
1f400 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
1f410 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65  abase. Otherwise
1f420 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20  , invoke it for 
1f430 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1f440 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ed zDb only..*/.
1f450 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
1f460 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
1f470 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
1f480 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1f490 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1f4a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1f4b0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1f4c0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1f4d0 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
1f4e0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
1f4f0 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
1f500 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73  && (!zDb || 0==s
1f510 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1f520 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20  b, pDb->zName)) 
1f530 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f540 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1f550 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20  (pParse, i);.   
1f560 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1f570 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
1f580 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
1f590 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
1f5a0 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
1f5b0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
1f5c0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1f5d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   This routine st
1f5e0 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73  arts a new trans
1f5f0 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65  action if we are
1f600 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74   not already wit
1f610 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
1f620 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65  tion.  If we are
1f630 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
1f640 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
1f650 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hen a checkpoint
1f660 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68  .** is set if th
1f670 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70  e setStatement p
1f680 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
1f690 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  .  A checkpoint 
1f6a0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74  should.** be set
1f6b0 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   for operations 
1f6c0 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20  that might fail 
1f6d0 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72  (due to a constr
1f6e0 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a  aint) part of.**
1f6f0 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68   the way through
1f700 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20   and which will 
1f710 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d  need to undo som
1f720 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74  e writes without
1f730 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f   having to.** ro
1f740 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  llback the whole
1f750 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46   transaction.  F
1f760 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68  or operations wh
1f770 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ere all constrai
1f780 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68  nts.** can be ch
1f790 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79  ecked before any
1f7a0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
1f7b0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1f7c0 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a  e, it is never.*
1f7d0 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  * necessary to u
1f7e0 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20  ndo a write and 
1f7f0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73  the checkpoint s
1f800 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74  hould not be set
1f810 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f820 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1f830 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1f840 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65  se, int setState
1f850 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a  ment, int iDb){.
1f860 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1f870 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1f880 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1f890 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  );.  sqlite3Code
1f8a0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
1f8b0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f  rse, iDb);.  pTo
1f8c0 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73  plevel->writeMas
1f8d0 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31  k |= ((yDbMask)1
1f8e0 29 3c 3c 69 44 62 3b 0a 20 20 70 54 6f 70 6c 65  )<<iDb;.  pTople
1f8f0 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  vel->isMultiWrit
1f900 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e  e |= setStatemen
1f910 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  t;.}../*.** Indi
1f920 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74  cate that the st
1f930 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  atement currentl
1f940 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
1f950 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65  tion might write
1f960 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
1f970 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65  e entry (example
1f980 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72  : deleting one r
1f990 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e  ow then insertin
1f9a0 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e  g another,.** in
1f9b0 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  serting multiple
1f9c0 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65   rows in a table
1f9d0 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61  , or inserting a
1f9e0 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65   row and index e
1f9f0 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61  ntries.).** If a
1fa00 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61  n abort occurs a
1fa10 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65  fter some of the
1fa20 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63  se writes have c
1fa30 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69  ompleted, then i
1fa40 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63  t will.** be nec
1fa50 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74  essary to undo t
1fa60 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69  he completed wri
1fa70 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tes..*/.void sql
1fa80 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50  ite3MultiWrite(P
1fa90 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1faa0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1fab0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1fac0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1fad0 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69  ;.  pToplevel->i
1fae0 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b  sMultiWrite = 1;
1faf0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63  .}../* .** The c
1fb00 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61  ode generator ca
1fb10 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
1fb20 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73   if is discovers
1fb30 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70   that it is.** p
1fb40 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74  ossible to abort
1fb50 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69   a statement pri
1fb60 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  or to completion
1fb70 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a  .  In order to .
1fb80 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  ** perform this 
1fb90 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f  abort without co
1fba0 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74  rrupting the dat
1fbb0 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74  abase, we need t
1fbc0 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74  o make.** sure t
1fbd0 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
1fbe0 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  t is protected b
1fbf0 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  y a statement tr
1fc00 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1fc10 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65   Technically, we
1fc20 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65   only need to se
1fc30 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66  t the mayAbort f
1fc40 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73  lag if the.** is
1fc50 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20  MultiWrite flag 
1fc60 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  was previously s
1fc70 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  et.  There is a 
1fc80 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
1fc90 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65  ** such that the
1fca0 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75   abort must occu
1fcb0 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74  r after the mult
1fcc0 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61  iwrite.  This ma
1fcd0 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74  kes.** some stat
1fce0 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67  ements involving
1fcf0 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e   the REPLACE con
1fd00 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
1fd10 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f   algorithm.** go
1fd20 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72   a little faster
1fd30 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64  .  But taking ad
1fd40 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20  vantage of this 
1fd50 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a  time dependency.
1fd60 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65  ** makes it more
1fd70 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72   difficult to pr
1fd80 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64  ove that the cod
1fd90 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e  e is correct (in
1fda0 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c   .** particular,
1fdb0 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20   it prevents us 
1fdc0 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20  from writing an 
1fdd0 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70  effective.** imp
1fde0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73  lementation of s
1fdf0 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1fe00 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77  bort()) and so w
1fe10 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a  e have chosen.**
1fe20 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66   to take the saf
1fe30 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70  e route and skip
1fe40 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
1fe50 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
1fe60 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65  e3MayAbort(Parse
1fe70 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72   *pParse){.  Par
1fe80 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1fe90 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1fea0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1feb0 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62  pToplevel->mayAb
1fec0 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ort = 1;.}../*.*
1fed0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
1fee0 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68  t that causes th
1fef0 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e  e vdbe to return
1ff00 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   an SQLITE_CONST
1ff10 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20  RAINT.** error. 
1ff20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61  The onError para
1ff30 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
1ff40 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20   which (if any) 
1ff50 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
1ff60 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65  .** and/or curre
1ff70 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
1ff80 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1ff90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61  /.void sqlite3Ha
1ffa0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ltConstraint(.  
1ffb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1ffc0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1ffd0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72  text */.  int er
1ffe0 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65  rCode,      /* e
1fff0 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f  xtended error co
20000 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  de */.  int onEr
20010 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
20020 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
20030 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20    char *p4,     
20040 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
20050 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74  sage */.  i8 p4t
20060 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ype,        /* P
20070 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54  4_STATIC or P4_T
20080 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38  RANSIENT */.  u8
20090 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20   p5Errmsg       
200a0 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70  /* P5_ErrMsg typ
200b0 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
200c0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
200d0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
200e0 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30  sert( (errCode&0
200f0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
20100 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28  STRAINT );.  if(
20110 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
20120 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
20130 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
20140 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
20150 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
20160 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20  _Halt, errCode, 
20170 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20  onError, 0, p4, 
20180 70 34 74 79 70 65 29 3b 0a 20 20 69 66 28 20 70  p4type);.  if( p
20190 35 45 72 72 6d 73 67 20 29 20 73 71 6c 69 74 65  5Errmsg ) sqlite
201a0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
201b0 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f   p5Errmsg);.}../
201c0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
201d0 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51  Halt due to UNIQ
201e0 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
201f0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  Y constraint vio
20200 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  lation..*/.void 
20210 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
20220 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
20230 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
20240 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
20250 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
20260 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
20270 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49  aint type */.  I
20280 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
20290 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
202a0 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20  at triggers the 
202b0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b  constraint */.){
202c0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
202d0 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63   int j;.  StrAcc
202e0 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62  um errMsg;.  Tab
202f0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d  le *pTab = pIdx-
20300 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69  >pTable;..  sqli
20310 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
20320 26 65 72 72 4d 73 67 2c 20 30 2c 20 30 2c 20 32  &errMsg, 0, 0, 2
20330 30 30 29 3b 0a 20 20 65 72 72 4d 73 67 2e 64 62  00);.  errMsg.db
20340 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
20350 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
20360 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
20370 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  .    char *zCol 
20380 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  = pTab->aCol[pId
20390 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  x->aiColumn[j]].
203a0 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 6a  zName;.    if( j
203b0 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
203c0 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67  umAppend(&errMsg
203d0 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20  , ", ", 2);.    
203e0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
203f0 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 70  ppend(&errMsg, p
20400 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 3b  Tab->zName, -1);
20410 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
20420 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d  ccumAppend(&errM
20430 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20  sg, ".", 1);.   
20440 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
20450 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  Append(&errMsg, 
20460 7a 43 6f 6c 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20  zCol, -1);.  }. 
20470 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53   zErr = sqlite3S
20480 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65  trAccumFinish(&e
20490 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
204a0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
204b0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 28 70 49  pParse, .    (pI
204c0 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 3d 3d 32  dx->autoIndex==2
204d0 29 3f 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  )?SQLITE_CONSTRA
204e0 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 53  INT_PRIMARYKEY:S
204f0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
20500 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45  _UNIQUE,.    onE
20510 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44  rror, zErr, P4_D
20520 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74  YNAMIC, P5_Const
20530 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
20540 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
20550 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e  OP_Halt due to n
20560 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e  on-unique rowid.
20570 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20580 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28  RowidConstraint(
20590 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
205a0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
205b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
205c0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
205d0 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
205e0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ution algorithm 
205f0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
20600 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
20610 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e  ble with the non
20620 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f  -unique rowid */
20630 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   .){.  char *zMs
20640 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  g;.  int rc;.  i
20650 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
20660 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  0 ){.    zMsg = 
20670 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
20680 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25  Parse->db, "%s.%
20690 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
206a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
206b0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
206c0 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
206d0 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  y].zName);.    r
206e0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
206f0 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
20700 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
20710 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
20720 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
20730 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61   "%s.rowid", pTa
20740 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
20750 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
20760 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d  RAINT_ROWID;.  }
20770 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
20780 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
20790 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d   rc, onError, zM
207a0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a  sg, P4_DYNAMIC,.
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74          P5_Const
207d0 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
207e0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
207f0 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
20800 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
20810 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
20820 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
20830 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
20840 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
20850 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
20860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
20870 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
20880 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
20890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
208a0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
208b0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
208c0 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b  ert( zColl!=0 );
208d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
208e0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
208f0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
20900 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
20910 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
20920 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20  assert( z!=0 || 
20930 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
20940 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28  [i]<0 );.    if(
20950 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
20960 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71  n[i]>=0 && 0==sq
20970 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
20980 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
20990 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
209a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
209b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
209c0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
209d0 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
209e0 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
209f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
20a00 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
20a10 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
20a20 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
20a30 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
20a40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
20a50 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
20a60 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
20a70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
20a80 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72  able *pTab, char
20a90 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
20aa0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ac0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
20ad0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
20ae0 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d  /..  for(pIndex=
20af0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
20b00 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
20b10 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
20b20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( zColl==0 ||
20b30 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
20b40 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29  zColl, pIndex) )
20b50 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
20b60 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
20b70 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
20b80 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
20b90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20ba0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
20bb0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
20bc0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
20bd0 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
20be0 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
20bf0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
20c00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
20c10 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
20c20 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
20c30 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
20c40 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
20c50 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
20c60 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
20c70 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
20c80 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
20c90 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
20ca0 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
20cb0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
20cc0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
20cd0 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
20ce0 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73  exDatabases(Pars
20cf0 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
20d00 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
20d10 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20d30 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
20d40 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
20d70 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
20d80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
20d90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
20da0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
20db0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
20dc0 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20de0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
20df0 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
20e00 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
20e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
20e30 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
20e40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20e50 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
20e60 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20  exes(db) );  /* 
20e70 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d  Needed for schem
20e80 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f  a access */.  fo
20e90 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
20ea0 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
20eb0 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
20ec0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
20ed0 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  b!=0 );.    for(
20ee0 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
20ef0 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
20f00 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
20f10 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
20f20 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
20f30 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
20f40 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
20f50 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
20f60 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43  pParse, pTab, zC
20f70 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
20f80 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20f90 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
20fa0 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
20fb0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
20fc0 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
20ff0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
21000 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
21010 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
21020 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
21030 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
21040 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
21050 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
21060 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
21070 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
21080 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
21090 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
210a0 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
210b0 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
210c0 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
210d0 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
210e0 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
210f0 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
21100 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
21110 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
21120 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
21130 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
21140 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
21150 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
21160 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
21170 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
21180 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
21190 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
211a0 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
211b0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
211c0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
211d0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
211e0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
211f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21200 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
21210 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
21220 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
21230 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
21240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21250 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
21260 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
21270 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
21280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
21290 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
212a0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
212b0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
212c0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
212d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
212e0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
212f0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
21300 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
21310 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
21320 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
21350 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
21360 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
21370 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
21380 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
21390 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
213a0 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
213b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
213c0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
213d0 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
213e0 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
213f0 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
21400 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
21410 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
21420 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
21430 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
21440 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
21450 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
21460 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
21470 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
21480 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
21490 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
214a0 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
214b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
214c0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
214d0 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
214e0 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e  n;.  }else if( N
214f0 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20  EVER(pName2==0) 
21500 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
21510 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
21520 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ll;.    assert( 
21530 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
21540 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
21550 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
21560 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31  arse->db, pName1
21570 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  );.    if( !zCol
21580 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
21590 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
215a0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
215b0 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
215c0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
215d0 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65   ){.      reinde
215e0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
215f0 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
21600 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21610 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  b, zColl);.     
21620 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
21630 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
21640 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
21650 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
21660 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
21670 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
21680 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
21690 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
216a0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
216b0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
216c0 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
216d0 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
216e0 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
216f0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
21700 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
21710 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
21720 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
21730 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
21740 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
21750 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
21760 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
21770 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
21780 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
21790 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
217a0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
217b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
217c0 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
217d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
217e0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
217f0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
21800 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
21810 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
21820 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
21830 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
21840 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
21850 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
21860 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
21870 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
21880 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
21890 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
218a0 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61  rn a dynamicly a
218b0 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f  llocated KeyInfo
218c0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
218d0 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77  can be used.** w
218e0 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  ith OP_OpenRead 
218f0 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  or OP_OpenWrite 
21900 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 62 61  to access databa
21910 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  se index pIdx..*
21920 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
21930 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ul, a pointer to
21940 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74 75   the new structu
21950 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  re is returned. 
21960 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
21970 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
21980 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
21990 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  lling sqlite3DbF
219a0 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 74 68 65  ree(db, ) on the
219b0 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f   returned .** po
219c0 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72  inter. If an err
219d0 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f  or occurs (out o
219e0 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73  f memory or miss
219f0 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a  ing collation .*
21a00 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c  * sequence), NUL
21a10 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
21a20 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 70  d the state of p
21a30 50 61 72 73 65 20 75 70 64 61 74 65 64 20 74 6f  Parse updated to
21a40 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20   reflect.** the 
21a50 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  error..*/.KeyInf
21a60 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b  o *sqlite3IndexK
21a70 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyinfo(Parse *pP
21a80 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
21a90 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  x){.  int i;.  i
21aa0 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt nCol = pIdx->
21ab0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e  nColumn;.  int n
21ac0 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79  Key = pIdx->nKey
21ad0 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  Col;.  KeyInfo *
21ae0 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 49 64  pKey;..  if( pId
21af0 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29  x->uniqNotNull )
21b00 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
21b10 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
21b20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
21b30 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20  y, nCol-nKey);. 
21b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
21b50 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
21b60 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
21b70 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d  b, nCol, 0);.  }
21b80 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
21b90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
21ba0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
21bb0 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
21bc0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  dx->azColl[i];. 
21bd0 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d       if( zColl==
21be0 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 49 4e  0 ) zColl = "BIN
21bf0 41 52 59 22 3b 0a 20 20 20 20 20 20 70 4b 65 79  ARY";.      pKey
21c00 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c  ->aColl[i] = sql
21c10 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
21c20 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
21c30 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
21c40 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
21c50 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
21c60 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  ];.    }.  }..  
21c70 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
21c80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
21c90 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
21ca0 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65  , pKey);.    pKe
21cb0 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
21cc0 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a              urn pKey;.}.