/ Hex Artifact Content
Login

Artifact 559d38b48f79bc92370c082f4606eefe1e8f94ac:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61   *v;..  db = pPa
0f40: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
0f50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f70: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
0f80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
0f90: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
0fa0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  turn;..  /* Begi
0fb0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
0fc0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
0fd0: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
0fe0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
0ff0: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1000: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1010: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1020: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1030: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1040: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1050: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1060: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
1070: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
1080: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1090: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
10a0: 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Halt);..    /* T
10b0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
10c0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
10d0: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
10e0: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
10f0: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
1100: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
1110: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
1120: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
1130: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
1140: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1150: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
1160: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1170: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
1180: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
1190: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
11a0: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
11b0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
11c0: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
11d0: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
11e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11f0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1200: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32  o>0 ){.      u32
1210: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74   mask;.      int
1220: 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69   iDb;.      sqli
1230: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1240: 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  v, pParse->cooki
1250: 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20  eGoto-1);.      
1260: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
1270: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
1280: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
1290: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
12a0: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
12b0: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
12c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12d0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
12e0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f 54 72  beAddOp2(v,OP_Tr
1310: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20  ansaction, iDb, 
1320: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1330: 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b 0a  writeMask)!=0);.
1340: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
1350: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
1360: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50  3VdbeAddOp2(v,OP
1380: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
1390: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
13a0: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
13b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13e0: 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
13f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1400: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
1410: 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69  se->nVtabLock; i
1420: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
1430: 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61  har *vtab = (cha
1440: 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54  r *)sqlite3GetVT
1450: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
1460: 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29 3b  >apVtabLock[i]);
1470: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1480: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1490: 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c  OP_VBegin, 0, 0,
14a0: 20 30 2c 20 76 74 61 62 2c 20 50 34 5f 56 54 41   0, vtab, P4_VTA
14b0: 42 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  B);.        }.  
14c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
14d0: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  tabLock = 0;.   
14e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
14f0: 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74     /* Once all t
1500: 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20  he cookies have 
1510: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e  been verified an
1520: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  d transactions o
1530: 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a  pened, .      **
1540: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
1550: 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73  ired table-locks
1560: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
1570: 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20  p unless the .  
1580: 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61      ** shared-ca
1590: 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65  che feature is e
15a0: 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  nabled..      */
15b0: 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65  .      codeTable
15c0: 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 0a  Locks(pParse);..
15d0: 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
15e0: 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43 52  ize any AUTOINCR
15f0: 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75 63  EMENT data struc
1600: 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e 0a  tures required..
1610: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1620: 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
1630: 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65 29  entBegin(pParse)
1640: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  ;..      /* Fina
1650: 6c 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20 74  lly, jump back t
1660: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1670: 6f 66 20 74 68 65 20 65 78 65 63 75 74 61 62 6c  of the executabl
1680: 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  e code. */.     
1690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16a0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
16b0: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
16c0: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Goto);.    }.  }
16d0: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
16e0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
16f0: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
1700: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
1710: 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e   ALWAYS(pParse->
1720: 6e 45 72 72 3d 3d 30 29 20 26 26 20 21 64 62 2d  nErr==0) && !db-
1730: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1750: 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74  EBUG.    FILE *t
1760: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
1770: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
1780: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
1790: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
17a0: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
17b0: 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  race);.#endif.  
17c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
17d0: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30  ->iCacheLevel==0
17e0: 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73   );  /* Disables
17f0: 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20   and re-enables 
1800: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20  match */.    /* 
1810: 41 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65  A minimum of one
1820: 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 69   cursor is requi
1830: 72 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65  red if autoincre
1840: 6d 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20  ment is used.   
1850: 20 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b   *  See ticket [
1860: 61 36 39 36 33 37 39 63 31 66 30 38 38 36 36 5d  a696379c1f08866]
1870: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
1880: 73 65 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26 20  se->pAinc!=0 && 
1890: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20  pParse->nTab==0 
18a0: 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d  ) pParse->nTab =
18b0: 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   1;.    sqlite3V
18c0: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20  dbeMakeReady(v, 
18d0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50  pParse->nVar, pP
18e0: 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20  arse->nMem,.    
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
1910: 62 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41  b, pParse->nMaxA
1920: 72 67 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  rg, pParse->expl
1930: 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ain,.           
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1950: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
1960: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
1970: 79 41 62 6f 72 74 29 3b 0a 20 20 20 20 70 50 61  yAbort);.    pPa
1980: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1990: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
19a0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
19b0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
19c0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
19d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
19e0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
19f0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   0;.  pParse->nM
1a00: 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  em = 0;.  pParse
1a10: 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50  ->nSet = 0;.  pP
1a20: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a  arse->nVar = 0;.
1a30: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
1a40: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72  Mask = 0;.  pPar
1a50: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
1a60: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e   0;.}../*.** Run
1a70: 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20   the parser and 
1a80: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72  code generator r
1a90: 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72  ecursively in or
1aa0: 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a  der to generate.
1ab0: 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ** code for the 
1ac0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69  SQL statement gi
1ad0: 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ven onto the end
1ae0: 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63   of the pParse c
1af0: 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e  ontext.** curren
1b00: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
1b10: 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68  uction.  When th
1b20: 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20  e parser is run 
1b30: 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74  recursively.** t
1b40: 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e  his way, the fin
1b50: 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f  al OP_Halt is no
1b60: 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f  t appended and o
1b70: 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74  ther initializat
1b80: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c  ion.** and final
1b90: 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72  ization steps ar
1ba0: 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73  e omitted becaus
1bb0: 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64  e those are hand
1bc0: 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f  ling by the.** o
1bd0: 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e  utermost parser.
1be0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79  .**.** Not every
1bf0: 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c  thing is nestabl
1c00: 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74  e.  This facilit
1c10: 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  y is designed to
1c20: 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52   permit.** INSER
1c30: 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44  T, UPDATE, and D
1c40: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
1c50: 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f   against SQLITE_
1c60: 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20  MASTER.  Use.** 
1c70: 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69  care if you deci
1c80: 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65  de to try to use
1c90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f   this routine fo
1ca0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1cb0: 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  poses..*/.void s
1cc0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1cd0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1ce0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
1cf0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
1d00: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
1d10: 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a   *zSql;.  char *
1d20: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73  zErrMsg = 0;.  s
1d30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d40: 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e  rse->db;.# defin
1d50: 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65  e SAVE_SZ  (size
1d60: 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73  of(Parse) - offs
1d70: 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29  etof(Parse,nVar)
1d80: 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 66  ).  char saveBuf
1d90: 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66  [SAVE_SZ];..  if
1da0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1db0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
1dc0: 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  t( pParse->neste
1dd0: 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74  d<10 );  /* Nest
1de0: 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ing should only 
1df0: 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65  be of limited de
1e00: 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72  pth */.  va_star
1e10: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
1e20: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1e30: 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f  VMPrintf(db, zFo
1e40: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1e50: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
1e60: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
1e70: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
1e80: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1e90: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1ea0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1eb0: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1ec0: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1ed0: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1ee0: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1ef0: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1f00: 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73    sqlite3RunPars
1f10: 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c  er(pParse, zSql,
1f20: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71   &zErrMsg);.  sq
1f30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f40: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1f50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
1f60: 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  ql);.  memcpy(&p
1f70: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76  Parse->nVar, sav
1f80: 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  eBuf, SAVE_SZ);.
1f90: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1fa0: 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  --;.}../*.** Loc
1fb0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1fc0: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
1fd0: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
1fe0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
1ff0: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
2000: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2010: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
2020: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
2030: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2040: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2050: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2060: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2070: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
2080: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
2090: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
20a0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
20b0: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a   table and the.*
20c0: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  * first matching
20d0: 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e   table is return
20e0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
20f0: 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  g for duplicate 
2100: 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69  table.** names i
2110: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
2120: 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45  arch order is TE
2130: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
2140: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a  AIN, then any.**
2150: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2160: 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67  ases added using
2170: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
2180: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  and..**.** See a
2190: 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  lso sqlite3Locat
21a0: 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62  eTable()..*/.Tab
21b0: 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54  le *sqlite3FindT
21c0: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
21d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
21e0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
21f0: 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54  *zDatabase){.  T
2200: 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69  able *p = 0;.  i
2210: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  nt i;.  int nNam
2220: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61  e;.  assert( zNa
2230: 6d 65 21 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d 65  me!=0 );.  nName
2240: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2250: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  30(zName);.  for
2260: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2270: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2280: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2290: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
22a0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
22b0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
22c0: 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21    if( zDatabase!
22d0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
22e0: 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20  ICmp(zDatabase, 
22f0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
2300: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2310: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
2320: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
2330: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
2340: 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  sh, zName, nName
2350: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
2360: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
2370: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
2380: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
2390: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
23a0: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
23b0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
23c0: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
23d0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
23e0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
23f0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
2400: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
2410: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
2420: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2430: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2440: 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61  found.  Also lea
2450: 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d  ve an.** error m
2460: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2470: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
2480: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2490: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
24a0: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
24b0: 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74  FindTable() is t
24c0: 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hat this.** rout
24d0: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
24e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
24f0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77  Parse->zErrMsg w
2500: 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46  here.** sqlite3F
2510: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
2520: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
2530: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2540: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
2550: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63  se,         /* c
2560: 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68 20  ontext in which 
2570: 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  to report errors
2580: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77   */.  int isView
2590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
25a0: 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20  True if looking 
25b0: 66 6f 72 20 61 20 56 49 45 57 20 72 61 74 68 65  for a VIEW rathe
25c0: 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45 20 2a  r than a TABLE *
25d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25e0: 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61  zName,     /* Na
25f0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
2600: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  we are looking f
2610: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
2620: 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f  ar *zDbase     /
2630: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2640: 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62  tabase.  Might b
2650: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
2660: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
2670: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
2680: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
2690: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
26a0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
26b0: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
26c0: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
26d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
26e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
26f0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
2700: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
2710: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2720: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
2730: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
2740: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2750: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2760: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2770: 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65 77 20   *zMsg = isView 
2780: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2790: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
27a0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61  e";.    if( zDba
27b0: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
27c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
27d0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
27e0: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
27f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2800: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2810: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2820: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
2830: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
2840: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
2850: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
2860: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2870: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
2880: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
2890: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
28a0: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
28b0: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
28c0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
28d0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
28e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
28f0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
2900: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
2910: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
2920: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
2930: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
2940: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
2950: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
2960: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
2970: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
2980: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
2990: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
29a0: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
29b0: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
29c0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
29d0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
29e0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
29f0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2a00: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
2a10: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
2a20: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
2a30: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
2a40: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
2a50: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
2a60: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
2a70: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
2a80: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
2a90: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
2aa0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  t i;.  int nName
2ab0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2ac0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  30(zName);.  for
2ad0: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2ae0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2af0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2b00: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
2b10: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2b20: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2b30: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
2b40: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
2b50: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
2b60: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
2b70: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
2b80: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
2b90: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
2ba0: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
2bb0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
2bc0: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
2bd0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
2be0: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   nName);.    if(
2bf0: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
2c00: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2c10: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
2c20: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
2c30: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
2c40: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
2c50: 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73  x(Index *p){.  s
2c60: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
2c70: 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 23  pTable->dbMem;.#
2c80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c90: 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c  IT_ANALYZE.  sql
2ca0: 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53  ite3DeleteIndexS
2cb0: 61 6d 70 6c 65 73 28 70 29 3b 0a 23 65 6e 64 69  amples(p);.#endi
2cc0: 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  f.  sqlite3DbFre
2cd0: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
2ce0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2cf0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
2d00: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67  .** Remove the g
2d10: 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20  iven index from 
2d20: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
2d30: 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a  able, and free.*
2d40: 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72  * its memory str
2d50: 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  uctures..**.** T
2d60: 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f  he index is remo
2d70: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ved from the dat
2d80: 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65  abase hash table
2d90: 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e  s but.** it is n
2da0: 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  ot unlinked from
2db0: 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20   the Table that 
2dc0: 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55  it indexes..** U
2dd0: 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68  nlinking from th
2de0: 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e Table must be 
2df0: 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c  done by the call
2e00: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
2e10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2e20: 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 28  ite3DeleteIndex(
2e30: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64  Index *p){.  Ind
2e40: 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73  ex *pOld;.  cons
2e50: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
2e60: 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c  p->zName;..  pOl
2e70: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
2e80: 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d  nsert(&p->pSchem
2e90: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
2ea0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2ec0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
2ed0: 61 6d 65 29 2c 20 30 29 3b 0a 20 20 61 73 73 65  ame), 0);.  asse
2ee0: 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70  rt( pOld==0 || p
2ef0: 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65  Old==p );.  free
2f00: 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  Index(p);.}../*.
2f10: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
2f20: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
2f30: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
2f40: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2f50: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
2f60: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
2f70: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
2f80: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
2f90: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
2fa0: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
2fb0: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
2fc0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
2fd0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
2fe0: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
2ff0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
3000: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
3010: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
3020: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
3030: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
3040: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  x *pIndex;.  int
3050: 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48   len;.  Hash *pH
3060: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
3070: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
3080: 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73  Hash;..  len = s
3090: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
30a0: 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  IdxName);.  pInd
30b0: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
30c0: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49  Insert(pHash, zI
30d0: 64 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b  dxName, len, 0);
30e0: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
30f0: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
3100: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
3110: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
3120: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3130: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
3140: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
3150: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
3160: 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73  *p;.      /* Jus
3170: 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c  tification of AL
3180: 57 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64  WAYS();  The ind
3190: 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68  ex must be on th
31a0: 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20  e list of.      
31b0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20  ** indices. */. 
31c0: 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d       p = pIndex-
31d0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
31e0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
31f0: 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e  WAYS(p) && p->pN
3200: 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70  ext!=pIndex ){ p
3210: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20   = p->pNext; }. 
3220: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
3230: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
3240: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
3250: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
3260: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3270: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
3280: 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
3290: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
32a0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
32b0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
32c0: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
32d0: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
32e0: 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  from the in-memo
32f0: 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  ry hash tables o
3300: 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61  f.** a single da
3310: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
3320: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3330: 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72  to reclaim memor
3340: 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20  y.** before the 
3350: 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e  database closes.
3360: 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c    It is also cal
3370: 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  led during a rol
3380: 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72  lback.** if ther
3390: 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68  e were schema ch
33a0: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
33b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
33c0: 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63  if a.** schema-c
33d0: 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f  ookie mismatch o
33e0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ccurs..**.** If 
33f0: 69 44 62 3d 3d 30 20 74 68 65 6e 20 72 65 73 65  iDb==0 then rese
3400: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
3410: 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72  chema tables for
3420: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
3430: 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e   files.  If iDb>
3440: 3d 31 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =1 then reset th
3450: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
3460: 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a  a for only the.*
3470: 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e  * single file in
3480: 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dicated..*/.void
3490: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
34a0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
34b0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
34c0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
34d0: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
34e0: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
34f0: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20  ;..  if( iDb==0 
3500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
3510: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
3520: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 44 62  .  }.  for(i=iDb
3530: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3540: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
3550: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
3560: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
3570: 6d 61 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ma ){.      asse
3580: 72 74 28 69 3d 3d 31 20 7c 7c 20 28 70 44 62 2d  rt(i==1 || (pDb-
3590: 3e 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42  >pBt && sqlite3B
35a0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
35b0: 44 62 2d 3e 70 42 74 29 29 29 3b 0a 20 20 20 20  Db->pBt)));.    
35c0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46    sqlite3SchemaF
35d0: 72 65 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ree(pDb->pSchema
35e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
35f0: 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b   iDb>0 ) return;
3600: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
3610: 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66  Db==0 );.  db->f
3620: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
3630: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
3640: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
3650: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71  ckList(db);.  sq
3660: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
3670: 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ll(db);..  /* If
3680: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
3690: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
36a0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
36b0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
36c0: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
36d0: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hem from the aux
36e0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
36f0: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
3700: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
3710: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
3720: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
3730: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
3740: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
3750: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
3760: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
3770: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
3780: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
3790: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
37a0: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
37b0: 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69  /.  for(i=j=2; i
37c0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
37d0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
37e0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
37f0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3800: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Bt==0 ){.      s
3810: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3820: 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20   pDb->zName);.  
3830: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
3840: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
3850: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
3860: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
3870: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
3880: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
3890: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
38a0: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
38b0: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
38c0: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
38d0: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
38e0: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
38f0: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
3900: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
3910: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
3920: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
3930: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
3940: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
3950: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3960: 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  , db->aDb);.    
3970: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
3980: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
3990: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
39a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
39b0: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
39c0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
39d0: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
39e0: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
39f0: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
3a00: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3a10: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
3a20: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
3a30: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
3a40: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
3a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3a60: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
3a70: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
3a80: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
3a90: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3aa0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3ab0: 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a   pTable->dbMem;.
3ac0: 20 20 74 65 73 74 63 61 73 65 28 20 64 62 3d 3d    testcase( db==
3ad0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3ae0: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  Table!=0 );.  if
3af0: 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65  ( (pCol = pTable
3b00: 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20  ->aCol)!=0 ){.  
3b10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
3b20: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  ble->nCol; i++, 
3b30: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73  pCol++){.      s
3b40: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3b50: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
3b60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3b70: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
3b80: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73  >pDflt);.      s
3b90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3ba0: 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20   pCol->zDflt);. 
3bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3bc0: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79  ee(db, pCol->zTy
3bd0: 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pe);.      sqlit
3be0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
3bf0: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
3c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3c10: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61  ee(db, pTable->a
3c20: 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62  Col);.  }.  pTab
3c30: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3c40: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
3c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
3c60: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74  e the memory dat
3c70: 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  a structures ass
3c80: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
3c90: 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e   given.** Table.
3ca0: 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65    No changes are
3cb0: 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79   made to disk by
3cc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
3cd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3ce0: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74  e just deletes t
3cf0: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
3d00: 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  e.  It does not 
3d10: 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61  unlink.** the ta
3d20: 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ble data structu
3d30: 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  re from the hash
3d40: 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20   table.  But it 
3d50: 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20  does destroy.** 
3d60: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
3d70: 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73  s of the indices
3d80: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
3d90: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3da0: 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e  h .** the table.
3db0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3dc0: 44 65 6c 65 74 65 54 61 62 6c 65 28 54 61 62 6c  DeleteTable(Tabl
3dd0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
3de0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
3df0: 65 78 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ext;.  sqlite3 *
3e00: 64 62 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c  db;..  if( pTabl
3e10: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
3e20: 20 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62   db = pTable->db
3e30: 4d 65 6d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  Mem;.  testcase(
3e40: 20 64 62 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20   db==0 );..  /* 
3e50: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
3e60: 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68  e table until th
3e70: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
3e80: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  t reaches zero. 
3e90: 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  */.  pTable->nRe
3ea0: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  f--;.  if( pTabl
3eb0: 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  e->nRef>0 ){.   
3ec0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
3ed0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
3ee0: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
3ef0: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
3f00: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3f10: 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  th this table.  
3f20: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
3f30: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
3f40: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
3f50: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
3f60: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
3f70: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
3f80: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d  pIndex->pSchema=
3f90: 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61  =pTable->pSchema
3fa0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
3fb0: 65 6c 65 74 65 49 6e 64 65 78 28 70 49 6e 64 65  eleteIndex(pInde
3fc0: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  x);.  }..  /* De
3fd0: 6c 65 74 65 20 61 6e 79 20 66 6f 72 65 69 67 6e  lete any foreign
3fe0: 20 6b 65 79 73 20 61 74 74 61 63 68 65 64 20 74   keys attached t
3ff0: 6f 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  o this table. */
4000: 0a 20 20 73 71 6c 69 74 65 33 46 6b 44 65 6c 65  .  sqlite3FkDele
4010: 74 65 28 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f  te(pTable);..  /
4020: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
4030: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
4040: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
4050: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
4060: 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  es(pTable);.  sq
4070: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4080: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
4090: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
40a0: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c  db, pTable->zCol
40b0: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Aff);.  sqlite3S
40c0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
40d0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
40e0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
40f0: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71  _OMIT_CHECK.  sq
4100: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4110: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  db, pTable->pChe
4120: 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  ck);.#endif.  sq
4130: 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28 70  lite3VtabClear(p
4140: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
4150: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4160: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
4170: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
4180: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
4190: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
41a0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
41b0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
41c0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
41d0: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
41e0: 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   keys..*/.void s
41f0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
4200: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
4210: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
4220: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
4230: 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  bName){.  Table 
4240: 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  *p;.  Db *pDb;..
4250: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
4260: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
4270: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
4280: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
4290: 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 74 65  zTabName );.  te
42a0: 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65  stcase( zTabName
42b0: 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65  [0]==0 );  /* Ze
42c0: 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20  ro-length table 
42d0: 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  names are allowe
42e0: 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  d */.  pDb = &db
42f0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20  ->aDb[iDb];.  p 
4300: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
4310: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
4320: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  a->tblHash, zTab
4330: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
4350: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
4360: 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73 71  abName),0);.  sq
4370: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
4380: 28 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  (p);.  db->flags
4390: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
43a0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
43b0: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
43c0: 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e  , return a strin
43d0: 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  g that consists 
43e0: 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  of the text of t
43f0: 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53  hat.** token.  S
4400: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
4410: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
4420: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
4430: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
4440: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
4450: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
4460: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
4470: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74  ..**.** Any quot
4480: 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a  ation marks (ex:
4490: 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27    "name", 'name'
44a0: 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61  , [name], or `na
44b0: 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72  me`) that.** sur
44c0: 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f  round the body o
44d0: 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20  f the token are 
44e0: 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  removed..**.** T
44f0: 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20  okens are often 
4500: 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  just pointers in
4510: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
4520: 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a  SQL text and so.
4530: 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20  ** are not \000 
4540: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61  terminated and a
4550: 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e  re not persisten
4560: 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  t.  The returned
4570: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30   string.** is \0
4580: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
4590: 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  d is persistent.
45a0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
45b0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73  3NameFromToken(s
45c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
45d0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
45e0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
45f0: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
4600: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
4610: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
4620: 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  )pName->z, pName
4630: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
4640: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
4650: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
4660: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
4670: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
4680: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
4690: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
46a0: 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74  le stored in dat
46b0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62  abase number iDb
46c0: 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e   for.** writing.
46d0: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70   The table is op
46e0: 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f  ened using curso
46f0: 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r 0..*/.void sql
4700: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
4710: 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e  ble(Parse *p, in
4720: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
4730: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
4740: 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  be(p);.  sqlite3
4750: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62  TableLock(p, iDb
4760: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31  , MASTER_ROOT, 1
4770: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
4780: 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Db));.  sqlite3V
4790: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
47a0: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41  OpenWrite, 0, MA
47b0: 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b  STER_ROOT, iDb);
47c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
47d0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
47e0: 68 61 72 20 2a 29 35 2c 20 50 34 5f 49 4e 54 33  har *)5, P4_INT3
47f0: 32 29 3b 20 20 2f 2a 20 35 20 63 6f 6c 75 6d 6e  2);  /* 5 column
4800: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
4810: 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20  p->nTab==0 ){.  
4820: 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20    p->nTab = 1;. 
4830: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61   }.}../*.** Para
4840: 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e  meter zName poin
4850: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
4860: 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f  inated buffer co
4870: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
4880: 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61  e.** of a databa
4890: 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  se ("main", "tem
48a0: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
48b0: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
48c0: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
48d0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
48e0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
48f0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
4900: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20  b->aDb[], or.** 
4910: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
4920: 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  db cannot be fou
4930: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
4940: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c  e3FindDbName(sql
4950: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
4960: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4970: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20  int i = -1;     
4980: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4990: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20  number */.  if( 
49a0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20  zName ){.    Db 
49b0: 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20  *pDb;.    int n 
49c0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
49d0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
49e0: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
49f0: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
4a00: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
4a10: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
4a20: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  !OMIT_TEMPDB || 
4a30: 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c  i!=1 ) && n==sql
4a40: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
4a50: 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ->zName) && .   
4a60: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
4a70: 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e  3StrICmp(pDb->zN
4a80: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  ame, zName) ){. 
4a90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4aa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4ab0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
4ac0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
4ad0: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
4ae0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
4af0: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
4b00: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
4b10: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
4b20: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
4b30: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
4b40: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
4b50: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4b60: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4b70: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
4b80: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
4b90: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
4ba0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4bb0: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
4bc0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
4bd0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
4c00: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
4c10: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77         /* Name w
4c40: 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20  e are searching 
4c50: 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  for */.  zName =
4c60: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
4c70: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
4c80: 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46  ;.  i = sqlite3F
4c90: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e  indDbName(db, zN
4ca0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
4cb0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
4cc0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
4cd0: 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72  ./* The table or
4ce0: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
4cf0: 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20   name is passed 
4d00: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
4d10: 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e  via tokens.** pN
4d20: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
4d30: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
4d40: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
4d50: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
4d60: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ple:.**.** CREAT
4d70: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
4d80: 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68  (...);.** .** Th
4d90: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
4da0: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
4db0: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
4dc0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
4dd0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61  .** the table na
4de0: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
4df0: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
4e00: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4e10: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a  BLE yyy(...);.**
4e20: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
4e30: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
4e40: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
4e50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4e60: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70  tine sets the *p
4e70: 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20  pUnqual pointer 
4e80: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
4e90: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
4ea0: 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74  .** pName2) that
4eb0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
4ec0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
4ed0: 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  me.  The index o
4ee0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
4ef0: 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72  e "xxx" is retur
4f00: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
4f10: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a  te3TwoPartName(.
4f20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4f30: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
4f40: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
4f50: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
4f60: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
4f70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78        /* The "xx
4f80: 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  x" in the name "
4f90: 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78  xxx.yyy" or "xxx
4fa0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  " */.  Token *pN
4fb0: 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame2,      /* Th
4fc0: 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e  e "yyy" in the n
4fd0: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f  ame "xxx.yyy" */
4fe0: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
4ff0: 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  al     /* Write 
5000: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5010: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65  object name here
5020: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
5030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5040: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5050: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a   holding the obj
5060: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
5070: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5080: 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  b;..  if( ALWAYS
5090: 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26 20 70  (pName2!=0) && p
50a0: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20  Name2->n>0 ){.  
50b0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
50c0: 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71  usy ) {.      sq
50d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
50e0: 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64  arse, "corrupt d
50f0: 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20  atabase");.     
5100: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
5110: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
5120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
5130: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
5140: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
5150: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
5160: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
5170: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
5180: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5190: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
51a0: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
51b0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
51c0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
51d0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
51e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
51f0: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44  ert( db->init.iD
5200: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  b==0 || db->init
5210: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62  .busy );.    iDb
5220: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
5230: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
5240: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
5250: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
5260: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5270: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
5280: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
5290: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
52a0: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
52b0: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
52c0: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
52d0: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
52e0: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
52f0: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
5300: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
5310: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
5320: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
5330: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
5340: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
5350: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
5360: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
5370: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
5380: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
5390: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
53a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
53b0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
53c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
53d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
53e0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
53f0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
5400: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
5410: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
5420: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
5430: 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74  gs & SQLITE_Writ
5440: 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20  eSchema)==0.    
5450: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
5460: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d  te3StrNICmp(zNam
5470: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
5480: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5490: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
54a0: 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73  "object name res
54b0: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
54c0: 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61  al use: %s", zNa
54d0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
54e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
54f0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5500: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  E_OK;.}../*.** B
5510: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
5520: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
5530: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
5540: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
5550: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
5560: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
5570: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
5580: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
5590: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
55a0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
55b0: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
55c0: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
55d0: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
55e0: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
55f0: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
5600: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
5610: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
5620: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
5630: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
5640: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
5650: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
5660: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
5670: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
5680: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
5690: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
56a0: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
56b0: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
56c0: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
56d0: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
56e0: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
56f0: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
5700: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
5710: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
5720: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
5730: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
5740: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
5750: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
5760: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
5770: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
5780: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
5790: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
57a0: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
57b0: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
57c0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
57d0: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
57e0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
57f0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5800: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
5810: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
5820: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
5830: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
5840: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
5850: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
5860: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
5870: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
5880: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
5890: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
58a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
58b0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
58c0: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   First part of t
58d0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
58e0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
58f0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
5900: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
5910: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
5920: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5930: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
5940: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
5950: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
5960: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
5970: 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f  t isView,      /
5980: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5990: 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e  s a VIEW */.  in
59a0: 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f  t isVirtual,   /
59b0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
59c0: 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c  s a VIRTUAL tabl
59d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  e */.  int noErr
59e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
59f0: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
5a00: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
5a10: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
5a20: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
5a30: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
5a40: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
5a50: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
5a60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5a70: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
5a80: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
5a90: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
5aa0: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
5ab0: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
5ac0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
5ad0: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
5ae0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
5af0: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
5b00: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
5b10: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20  or view name to 
5b20: 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64  create is passed
5b30: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5b40: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a   via tokens.  **
5b50: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5b60: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5b70: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5b80: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5b90: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
5ba0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5bb0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20  xx.yyy (...);.  
5bc0: 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e  ** .  ** Then pN
5bd0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5be0: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
5bf0: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
5c00: 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a  her hand if.  **
5c10: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5c20: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
5c30: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20  lified, i.e.:.  
5c40: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5c50: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20  ABLE yyy(...);. 
5c60: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e   **.  ** Then pN
5c70: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5c80: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5c90: 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  is ""..  **.  **
5ca0: 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20   The call below 
5cb0: 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70  sets the pName p
5cc0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5cd0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5ce0: 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61  ame1 or.  ** pNa
5cf0: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5d00: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5d10: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5d20: 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73   variable iDb is
5d30: 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  .  ** set to the
5d40: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
5d50: 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20  tabase that the 
5d60: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
5d70: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61   to be.  ** crea
5d80: 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ted in..  */.  i
5d90: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
5da0: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
5db0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
5dc0: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  &pName);.  if( i
5dd0: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
5de0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5df0: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69  B && isTemp && i
5e00: 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Db>1 ){.    /* I
5e10: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
5e20: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
5e30: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
5e40: 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71  lified */.    sq
5e50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5e60: 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79  arse, "temporary
5e70: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74   table name must
5e80: 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22   be unqualified"
5e90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5ea0: 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54   }.  if( !OMIT_T
5eb0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5ec0: 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50  ) iDb = 1;..  pP
5ed0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
5ee0: 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61   = *pName;.  zNa
5ef0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5f00: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5f10: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
5f20: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
5f30: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
5f40: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
5f50: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
5f60: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
5f70: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5f80: 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ror;.  }.  if( d
5f90: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
5fa0: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
5fb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5fc0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
5fd0: 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70   assert( (isTemp
5fe0: 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b   & 1)==isTemp );
5ff0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
6000: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  e;.    char *zDb
6010: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
6020: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
6030: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
6040: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
6050: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
6060: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
6070: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
6080: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6090: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
60a0: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
60b0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
60c0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
60d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
60e0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
60f0: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
6100: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
6110: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
6120: 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ATE_VIEW;.      
6130: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
6140: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
6150: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b  PDB && isTemp ){
6160: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
6170: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
6180: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
6190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
61a0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
61b0: 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ATE_TABLE;.     
61c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
61d0: 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73   !isVirtual && s
61e0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
61f0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e  pParse, code, zN
6200: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
6210: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
6220: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6230: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
6240: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
6250: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
6260: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
6270: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
6280: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
6290: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  r table name in 
62a0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
62b0: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
62c0: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20  or message if.  
62d0: 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20  ** it does. The 
62e0: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20  exception is if 
62f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65  the statement be
6300: 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70  ing parsed was p
6310: 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e  assed.  ** to an
6320: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
6330: 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e  _vtab() call. In
6340: 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
6350: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
6360: 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20  .  ** and types 
6370: 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f  will be used, so
6380: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
6390: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61  d to test for na
63a0: 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c  mespace.  ** col
63b0: 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  lisions..  */.  
63c0: 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f  if( !IN_DECLARE_
63d0: 56 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28 20  VTAB ){.    if( 
63e0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
63f0: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
6400: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
6410: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6420: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6430: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
6440: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
6450: 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
6460: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
6470: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
6480: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
6490: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
64a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
64b0: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
64c0: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
64d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
64e0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
64f0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6500: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
6510: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
6520: 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44 62  e, 0)!=0 && (iDb
6530: 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74  ==0 || !db->init
6540: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20  .busy) ){.      
6550: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6560: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
6570: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
6580: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
6590: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
65a0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
65b0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
65c0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
65d0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
65e0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
65f0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
6600: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  0 ){.    db->mal
6610: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
6620: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
6630: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6640: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6650: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
6660: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6670: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
6680: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
6690: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
66a0: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
66b0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
66c0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61  ].pSchema;.  pTa
66d0: 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ble->nRef = 1;. 
66e0: 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 20 3d   pTable->dbMem =
66f0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
6700: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
6710: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
6720: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
6730: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
6740: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
6750: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
6760: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
6770: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
6780: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
6790: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
67a0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
67b0: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
67c0: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
67d0: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
67e0: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
67f0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
6800: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6810: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
6820: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
6830: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
6840: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
6850: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  e")==0 ){.    pT
6860: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70  able->pSchema->p
6870: 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b  SeqTab = pTable;
6880: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
6890: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
68a0: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
68b0: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65   will insert the
68c0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e   table record in
68d0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  to.  ** the SQLI
68e0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
68f0: 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63    Note in partic
6900: 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73  ular that we mus
6910: 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20  t go ahead.  ** 
6920: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  and allocate the
6930: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
6940: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  or the table ent
6950: 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20  ry now.  Before 
6960: 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59  any.  ** PRIMARY
6970: 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b   KEY or UNIQUE k
6980: 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73  eywords are pars
6990: 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f  ed.  Those keywo
69a0: 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20  rds will cause. 
69b0: 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62   ** indices to b
69c0: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68  e created and th
69d0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d  e table record m
69e0: 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  ust come before 
69f0: 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  the .  ** indice
6a00: 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72  s.  Hence, the r
6a10: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
6a20: 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   the table must 
6a30: 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a  be allocated.  *
6a40: 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  * now..  */.  if
6a50: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
6a60: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33   && (v = sqlite3
6a70: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
6a80: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  !=0 ){.    int j
6a90: 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  1;.    int fileF
6aa0: 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72  ormat;.    int r
6ab0: 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b  eg1, reg2, reg3;
6ac0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
6ad0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
6ae0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
6af0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6b00: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6b10: 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72  LE.    if( isVir
6b20: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
6b30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
6b40: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
6b50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
6b60: 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
6b70: 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64  format and encod
6b80: 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61 62  ing in the datab
6b90: 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  ase have not bee
6ba0: 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73  n set, .    ** s
6bb0: 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20  et them now..   
6bc0: 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70   */.    reg1 = p
6bd0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20  Parse->regRowid 
6be0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
6bf0: 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50 61  ;.    reg2 = pPa
6c00: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b  rse->regRoot = +
6c10: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
6c20: 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72     reg3 = ++pPar
6c30: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
6c40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6c50: 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
6c60: 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52  , iDb, reg3, BTR
6c70: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b  EE_FILE_FORMAT);
6c80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6c90: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
6ca0: 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  );.    j1 = sqli
6cb0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6cc0: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20   OP_If, reg3);. 
6cd0: 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20     fileFormat = 
6ce0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
6cf0: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
6d00: 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  t)!=0 ?.        
6d10: 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51            1 : SQ
6d20: 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f  LITE_MAX_FILE_FO
6d30: 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  RMAT;.    sqlite
6d40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6d50: 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46  P_Integer, fileF
6d60: 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20  ormat, reg3);.  
6d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6d80: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
6d90: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
6da0: 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67  FILE_FORMAT, reg
6db0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
6dc0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6dd0: 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29  Integer, ENC(db)
6de0: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
6df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6e00: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
6e10: 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f  iDb, BTREE_TEXT_
6e20: 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b  ENCODING, reg3);
6e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6e40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
6e50: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6e60: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6e70: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6e80: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6e90: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6ea0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6eb0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6ec0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
6ed0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
6ee0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
6ef0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
6f00: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
6f10: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
6f20: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
6f30: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6f40: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6f50: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
6f60: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
6f70: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
6f80: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
6f90: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
6fa0: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
6fb0: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
6fc0: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
6fd0: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
6fe0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
6ff0: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
7000: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
7010: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
7020: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
7030: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
7040: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7050: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
7060: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7070: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7080: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
7090: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
70a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
70b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
70c0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
70d0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
70e0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
70f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7100: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
7110: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
7120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7130: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
7140: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
7150: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7160: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
7170: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
7180: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7190: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
71a0: 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20  l, 0, reg3);.   
71b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
71c0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
71d0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
71e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
71f0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7200: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
7210: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7220: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
7230: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
7240: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
7250: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
7260: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
7270: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
7280: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
7290: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
72a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
72b0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
72c0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
72d0: 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  is macro is used
72e0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
72f0: 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73  strings in a cas
7300: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61  e-insensitive ma
7310: 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73  nner..** It is s
7320: 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
7330: 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  han calling sqli
7340: 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72  te3StrICmp() dir
7350: 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72  ectly, but.** pr
7360: 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f  oduces larger co
7370: 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  de..**.** WARNIN
7380: 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  G: This macro is
7390: 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20   not compatible 
73a0: 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28  with the strcmp(
73b0: 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20  ) family. It.** 
73c0: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
73d0: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  the two strings 
73e0: 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72  are equal, other
73f0: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
7400: 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78  define STRICMP(x
7410: 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55  , y) (\.sqlite3U
7420: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
7430: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78  signed char *)(x
7440: 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33  )]==   \.sqlite3
7450: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
7460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
7470: 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c  y)]     \.&& sql
7480: 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b  ite3StrICmp((x)+
7490: 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f  1,(y)+1)==0 )../
74a0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
74b0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
74c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
74d0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
74e0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
74f0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
7500: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
7510: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
7520: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
7530: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7540: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
7550: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
7560: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
7570: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
7580: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
7590: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
75a0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
75b0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
75c0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
75d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
75e0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
75f0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7600: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
7610: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
7620: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7630: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
7640: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7650: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
7660: 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  n;.#if SQLITE_MA
7670: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
7680: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
7690: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
76a0: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
76b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
76c0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
76d0: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
76e0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
76f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
7700: 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  dif.  z = sqlite
7710: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
7720: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
7730: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
7740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7750: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7760: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
7770: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
7780: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7790: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
77a0: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
77b0: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
77c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
77d0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
77e0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
77f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
7800: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
7810: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
7820: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
7830: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
7840: 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e  (db,p->aCol,(p->
7850: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
7860: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
7870: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
7880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
7890: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
78a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
78b0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
78c0: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
78d0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
78e0: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
78f0: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
7900: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
7910: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
7920: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7930: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
7940: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
7950: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
7960: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45  inity.  ** 'NONE
7970: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
7980: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
7990: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
79a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
79b0: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
79c0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
79d0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
79e0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
79f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
7a00: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
7a10: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a    p->nCol++;.}..
7a20: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7a30: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
7a40: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
7a50: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
7a60: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
7a70: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7a80: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
7a90: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
7aa0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
7ab0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
7ac0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
7ad0: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
7ae0: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
7af0: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
7b00: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
7b10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7b20: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
7b30: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
7b40: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
7b50: 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  *p;.  p = pParse
7b60: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
7b70: 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
7b80: 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65  (p->nCol<1) ) re
7b90: 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b  turn;.  p->aCol[
7ba0: 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75  p->nCol-1].notNu
7bb0: 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  ll = (u8)onError
7bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  ;.}../*.** Scan 
7bd0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
7be0: 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67  name zType (leng
7bf0: 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65  th nType) and re
7c00: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f  turn the.** asso
7c10: 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20  ciated affinity 
7c20: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  type..**.** This
7c30: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
7c40: 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74  case-independent
7c50: 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65   search of zType
7c60: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62   for the .** sub
7c70: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66  strings in the f
7c80: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20  ollowing table. 
7c90: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  If one of the su
7ca0: 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66  bstrings is.** f
7cb0: 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73  ound, the corres
7cc0: 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79  ponding affinity
7cd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
7ce0: 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a   zType contains.
7cf0: 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
7d00: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
7d10: 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61  gs, entries towa
7d20: 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a  rd the top of .*
7d30: 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65  * the table take
7d40: 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65   priority. For e
7d50: 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65  xample, if zType
7d60: 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a   is 'BLOBINT', .
7d70: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  ** SQLITE_AFF_IN
7d80: 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65  TEGER is returne
7d90: 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69  d..**.** Substri
7da0: 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74  ng     | Affinit
7db0: 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.** -----------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20  -----.** 'INT'  
7de0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7df0: 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27  AFF_INTEGER.** '
7e00: 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53  CHAR'        | S
7e10: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
7e20: 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'CLOB'        
7e30: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
7e40: 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20  T.** 'TEXT'     
7e50: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7e60: 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20  TEXT.** 'BLOB'  
7e70: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7e80: 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c  FF_NONE.** 'REAL
7e90: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7ea0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46  E_AFF_REAL.** 'F
7eb0: 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOA'        | SQ
7ec0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
7ed0: 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c   'DOUB'        |
7ee0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7ef0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f  .**.** If none o
7f00: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7f10: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61   in the above ta
7f20: 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  ble are found,.*
7f30: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
7f40: 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64  ERIC is returned
7f50: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
7f60: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f  3AffinityType(co
7f70: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a  nst char *zIn){.
7f80: 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63    u32 h = 0;.  c
7f90: 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45  har aff = SQLITE
7fa0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 0a 20  _AFF_NUMERIC;.. 
7fb0: 20 69 66 28 20 7a 49 6e 20 29 20 77 68 69 6c 65   if( zIn ) while
7fc0: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
7fd0: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
7fe0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
7ff0: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
8000: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
8010: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
8020: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
8030: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
8040: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
8050: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
8060: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a  LITE_AFF_TEXT; .
8070: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8080: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
8090: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
80a0: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
80b0: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
80c0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
80d0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
80e0: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
80f0: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
8100: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
8110: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
8120: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8130: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
8140: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
8150: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
8160: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
8170: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
8180: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
8190: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
81a0: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
81b0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
81c0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
81d0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23  LITE_AFF_NONE;.#
81e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
81f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
8200: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
8210: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
8220: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
8230: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
8240: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
8250: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8260: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8270: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8280: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
8290: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
82a0: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
82b0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
82c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
82d0: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
82e0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
82f0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
8300: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8310: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
8320: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
8330: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
8340: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
8350: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
8360: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
8370: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8380: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
8390: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
83a0: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
83b0: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
83c0: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
83d0: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
83e0: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
83f0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8400: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
8410: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8420: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
8430: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
8440: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8450: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
8460: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
8470: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
8480: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
8490: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
84a0: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
84b0: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
84c0: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
84d0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
84e0: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
84f0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
8500: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
8510: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
8520: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
8530: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
8540: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
8550: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
8560: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
8570: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
8580: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
8590: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
85a0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
85b0: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
85c0: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
85d0: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
85e0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
85f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
8600: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
8610: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
8620: 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d  mn *pCol;..  p =
8630: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8640: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
8650: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
8660: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
8670: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
8680: 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73  ->nCol-1];.  ass
8690: 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  ert( pCol->zType
86a0: 3d 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  ==0 );.  pCol->z
86b0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Type = sqlite3Na
86c0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
86d0: 73 65 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a  se->db, pType);.
86e0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
86f0: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
8700: 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79  tyType(pCol->zTy
8710: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
8720: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
8730: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
8740: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
8750: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
8760: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
8770: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
8780: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8790: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
87a0: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
87b0: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
87c0: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
87d0: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
87e0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
87f0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
8800: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8810: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8820: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8830: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8840: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8850: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
8860: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
8870: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
8880: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 53 70   *pParse, ExprSp
8890: 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61  an *pSpan){.  Ta
88a0: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
88b0: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
88c0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
88d0: 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  db;.  p = pParse
88e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
88f0: 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70  f( p!=0 ){.    p
8900: 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b  Col = &(p->aCol[
8910: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20  p->nCol-1]);.   
8920: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
8930: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
8940: 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78  ction(pSpan->pEx
8950: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
8960: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8970: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
8980: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
8990: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
89a0: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
89b0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
89c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
89d0: 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72   A copy of pExpr
89e0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
89f0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
8a00: 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61  , as pExpr conta
8a10: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b  ins.      ** tok
8a20: 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ens that point t
8a30: 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72  o volatile memor
8a40: 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66  y. The 'span' of
8a50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
8a60: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
8a70: 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20 74  ired by pragma t
8a80: 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20  able_info..     
8a90: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8aa0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8ab0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
8ac0: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
8ad0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8ae0: 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70  (db, pSpan->pExp
8af0: 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  r, EXPRDUP_REDUC
8b00: 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  E);.      sqlite
8b10: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
8b20: 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->zDflt);.      
8b30: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71  pCol->zDflt = sq
8b40: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
8b50: 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d  b, (char*)pSpan-
8b60: 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20  >zStart,.       
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
8b90: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
8ba0: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
8bb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
8bc0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8bd0: 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70  (db, pSpan->pExp
8be0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
8bf0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
8c00: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
8c10: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
8c20: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
8c30: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
8c40: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
8c50: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
8c60: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
8c70: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
8c80: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
8c90: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
8ca0: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
8cb0: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
8cc0: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
8cd0: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
8ce0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
8cf0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
8d00: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
8d10: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
8d20: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
8d30: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
8d40: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
8d50: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
8d60: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
8d70: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
8d80: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
8d90: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
8da0: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
8db0: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
8dc0: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
8dd0: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
8de0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
8df0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
8e00: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
8e10: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
8e20: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
8e30: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
8e40: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
8e50: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
8e60: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
8e70: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8e80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
8e90: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
8ea0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8eb0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
8ec0: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
8ed0: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
8ee0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
8ef0: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
8f00: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
8f10: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
8f20: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
8f30: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8f40: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8f50: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8f60: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
8f70: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
8f80: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
8f90: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
8fa0: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
8fb0: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
8fc0: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
8fd0: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
8fe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8ff0: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
9000: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
9010: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
9020: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
9030: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
9040: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
9050: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
9060: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
9070: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
9080: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
9090: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
90a0: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49  if( pTab==0 || I
90b0: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
90c0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
90d0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
90e0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
90f0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
9100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9110: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
9120: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
9130: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
9140: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
9150: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
9160: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
9170: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
9180: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
9190: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
91a0: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
91b0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
91c0: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
91d0: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
91e0: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
91f0: 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 1;.  }else{
9200: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9210: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
9220: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
9230: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
9240: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
9250: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9260: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
9270: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
9280: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9290: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
92a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
92b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
92c0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
92d0: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
92e0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
92f0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
9300: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
9310: 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  }.    if( pList-
9320: 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20  >nExpr>1 ) iCol 
9330: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
9340: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
9350: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
9360: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
9370: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
9380: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70  ;.  }.  if( zTyp
9390: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
93a0: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
93b0: 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  GER")==0.       
93c0: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53   && sortOrder==S
93d0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a  QLITE_SO_ASC ){.
93e0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
93f0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
9400: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29  ->keyConf = (u8)
9410: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  onError;.    ass
9420: 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20  ert( autoInc==0 
9430: 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b  || autoInc==1 );
9440: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
9450: 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54  ags |= autoInc*T
9460: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  F_Autoincrement;
9470: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
9480: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
9490: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
94a0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
94b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
94c0: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
94d0: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
94e0: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
94f0: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
9500: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
9510: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
9520: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20  Index *p;.    p 
9530: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
9540: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
9550: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
9560: 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74  rror, 0, 0, sort
9570: 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69  Order, 0);.    i
9580: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
9590: 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a  >autoIndex = 2;.
95a0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
95b0: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
95c0: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
95d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
95e0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
95f0: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
9600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
9610: 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74   new CHECK const
9620: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62  raint to the tab
9630: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
9640: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
9650: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9660: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
9670: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
9680: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
9690: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
96a0: 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72  Expr *pCheckExpr
96b0: 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65    /* The check e
96c0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
96d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
96e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e  pParse->db;.#ifn
96f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9700: 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70  CHECK.  Table *p
9710: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
9720: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9730: 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41  Tab && !IN_DECLA
9740: 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70  RE_VTAB ){.    p
9750: 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71  Tab->pCheck = sq
9760: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
9770: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
9780: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 65  CheckExpr);.  }e
9790: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
97a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
97b0: 6c 65 74 65 28 64 62 2c 20 70 43 68 65 63 6b 45  lete(db, pCheckE
97c0: 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  xpr);.  }.}../*.
97d0: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
97e0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66  tion function of
97f0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9800: 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20  ly parsed table 
9810: 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65  column.** to the
9820: 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a   CollSeq given..
9830: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
9840: 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  ddCollateType(Pa
9850: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
9860: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54  en *pToken){.  T
9870: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
9880: 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  ;.  char *zColl;
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98a0: 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f   Dequoted name o
98b0: 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
98c0: 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ence */.  sqlite
98d0: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  3 *db;..  if( (p
98e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
98f0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
9900: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
9910: 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  -1;.  db = pPars
9920: 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d  e->db;.  zColl =
9930: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
9940: 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e  Token(db, pToken
9950: 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  );.  if( !zColl 
9960: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
9970: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
9980: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
9990: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65  oll) ){.    Inde
99a0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e  x *pIdx;.    p->
99b0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20  aCol[i].zColl = 
99c0: 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a  zColl;.  .    /*
99d0: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
99e0: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
99f0: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
9a00: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
9a10: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ",.    ** then a
9a20: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
9a30: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
9a40: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
9a50: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ore the.    ** c
9a60: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
9a70: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
9a80: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
9a90: 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  he case..    */.
9aa0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e      for(pIdx=p->
9ab0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
9ac0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
9ad0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9ae0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
9af0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
9b00: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
9b10: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  i ){.        pId
9b20: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70  x->azColl[0] = p
9b30: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[i].zColl;
9b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
9b60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
9b70: 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oll);.  }.}../*.
9b80: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9b90: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
9ba0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9bb0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
9bc0: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
9bd0: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
9be0: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
9bf0: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
9c00: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
9c10: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
9c20: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
9c30: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
9c40: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
9c50: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
9c60: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
9c70: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
9c80: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
9c90: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
9ca0: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
9cb0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9cc0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
9cd0: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
9ce0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
9cf0: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
9d00: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
9d10: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
9d20: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
9d30: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
9d40: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
9d50: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
9d60: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
9d70: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
9d80: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
9d90: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
9da0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
9db0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
9dc0: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
9dd0: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
9de0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9df0: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
9e00: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
9e10: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
9e20: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
9e30: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
9e40: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
9e50: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
9e60: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
9e70: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
9e80: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
9e90: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ssage..**.** See
9ea0: 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69   also: sqlite3Fi
9eb0: 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c  ndCollSeq(), sql
9ec0: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29  ite3GetCollSeq()
9ed0: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
9ee0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
9ef0: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
9f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9f10: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
9f20: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9f30: 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28  .  u8 enc = ENC(
9f40: 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  db);.  u8 initbu
9f50: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
9f60: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
9f70: 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  Coll;..  pColl =
9f80: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
9f90: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
9fa0: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
9fb0: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
9fc0: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
9fd0: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
9fe0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
9ff0: 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20  3GetCollSeq(db, 
a000: 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  enc, pColl, zNam
a010: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  e);.    if( !pCo
a020: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
a030: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a040: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  se, "no such col
a050: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a  lation sequence:
a060: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
a070: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
a080: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
a090: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
a0a0: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
a0b0: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
a0c0: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
a0d0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
a0e0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
a0f0: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
a100: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
a110: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
a120: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
a130: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
a140: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
a150: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
a160: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
a170: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
a180: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
a190: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
a1a0: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
a1b0: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
a1c0: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
a1d0: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
a1e0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
a1f0: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
a200: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
a210: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
a220: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
a230: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
a240: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
a250: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
a260: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
a270: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
a280: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
a290: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
a2a0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
a2b0: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
a2c0: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
a2d0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
a2e0: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
a2f0: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
a300: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
a310: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
a320: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
a330: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
a340: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
a350: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
a360: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
a370: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
a380: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
a390: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
a3a0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a3b0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  rse);.  sqlite3 
a3c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a3d0: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
a3e0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73  arse->pVdbe;.  s
a3f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a400: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a410: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
a420: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
a430: 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71  kie+1, r1);.  sq
a440: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a450: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
a460: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
a470: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b  MA_VERSION, r1);
a480: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
a490: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a4a0: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   r1);.}../*.** M
a4b0: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
a4c0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
a4d0: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
a4e0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
a4f0: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
a500: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
a510: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
a520: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
a530: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
a540: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
a550: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
a560: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
a570: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
a580: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
a590: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
a5a0: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
a5b0: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
a5c0: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
a5d0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
a5e0: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
a5f0: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
a600: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
a610: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a620: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
a630: 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
a640: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
a650: 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75   to an output bu
a660: 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64  ffer. The second
a670: 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69   .** parameter i
a680: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
a690: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63  n integer that c
a6a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73  ontains the offs
a6b0: 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74  et at.** which t
a6c0: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
a6d0: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
a6e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
a6f0: 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d  pies the.** nul-
a700: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
a710: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
a720: 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65  the third parame
a730: 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e  ter, zSignedIden
a740: 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65  t,.** to the spe
a750: 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e  cified offset in
a760: 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20   the buffer and 
a770: 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f  updates *pIdx to
a780: 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65   refer.** to the
a790: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
a7a0: 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  r the last byte 
a7b0: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72  written before r
a7c0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a  eturning..** .**
a7d0: 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a   If the string z
a7e0: 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73  SignedIdent cons
a7f0: 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
a800: 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a   alpha-numeric.*
a810: 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f  * characters, do
a820: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
a830: 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73  h a digit and is
a840: 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77   not an SQL keyw
a850: 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ord,.** then it 
a860: 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  is copied to the
a870: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65   output buffer e
a880: 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e  xactly as it is.
a890: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69   Otherwise,.** i
a8a0: 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e  t is quoted usin
a8b0: 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e  g double-quotes.
a8c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a8d0: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
a8e0: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
a8f0: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
a900: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
a910: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
a920: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
a930: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
a940: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
a950: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20  .  i = *pIdx;.. 
a960: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
a970: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
a980: 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e  f( !sqlite3Isaln
a990: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
a9a0: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
a9b0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
a9c0: 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74  eedQuote = sqlit
a9d0: 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74  e3Isdigit(zIdent
a9e0: 5b 30 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b  [0]) || sqlite3K
a9f0: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
aa00: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20  t, j)!=TK_ID;.  
aa10: 69 66 28 20 21 6e 65 65 64 51 75 6f 74 65 20 29  if( !needQuote )
aa20: 7b 0a 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20  {.    needQuote 
aa30: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d  = zIdent[j];.  }
aa40: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
aa50: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
aa60: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
aa70: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
aa80: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
aa90: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
aaa0: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
aab0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
aac0: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
aad0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
aae0: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
aaf0: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
ab00: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
ab10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
ab20: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
ab30: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
ab40: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
ab50: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
ab60: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
ab70: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
ab80: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
ab90: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
aba0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
abb0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
abc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
abd0: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
abe0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
abf0: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
ac00: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
ac10: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
ac20: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
ac30: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
ac40: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
ac50: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
ac60: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
ac70: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
ac80: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
ac90: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
aca0: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
acb0: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
acc0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
acd0: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
ace0: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
acf0: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
ad00: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
ad10: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
ad20: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
ad30: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
ad40: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
ad50: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
ad60: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
ad70: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
ad80: 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74  n );.  if( zStmt
ad90: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
ada0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
adb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
adc0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
add0: 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20  rintf(n, zStmt, 
ade0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29  "CREATE TABLE ")
adf0: 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53  ;.  k = sqlite3S
ae00: 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a  trlen30(zStmt);.
ae10: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
ae20: 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  , &k, p->zName);
ae30: 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20  .  zStmt[k++] = 
ae40: 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d  '(';.  for(pCol=
ae50: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
ae60: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
ae70: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69  ol++){.    stati
ae80: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
ae90: 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20  onst azType[] = 
aea0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  {.        /* SQL
aeb0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
aec0: 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20  */ " TEXT",.    
aed0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
aee0: 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22 2c  F_NONE    */ "",
aef0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
af00: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a  TE_AFF_NUMERIC *
af10: 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20  / " NUM",.      
af20: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
af30: 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54  INTEGER */ " INT
af40: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
af50: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20  LITE_AFF_REAL   
af60: 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20   */ " REAL".    
af70: 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  };.    int len;.
af80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
af90: 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69  zType;..    sqli
afa0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
afb0: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65  , &zStmt[k], zSe
afc0: 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c  p);.    k += sql
afd0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53  ite3Strlen30(&zS
afe0: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
aff0: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
b000: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
b010: 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  k, pCol->zName);
b020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
b030: 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49  l->affinity-SQLI
b040: 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20 30  TE_AFF_TEXT >= 0
b050: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
b060: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53  pCol->affinity-S
b070: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3c  QLITE_AFF_TEXT <
b080: 20 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 29 2f   sizeof(azType)/
b090: 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 5b 30 5d  sizeof(azType[0]
b0a0: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
b0b0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
b0c0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
b0d0: 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  XT );.    testca
b0e0: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
b0f0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty==SQLITE_AFF_N
b100: 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ONE );.    testc
b110: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
b120: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
b130: 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74  NUMERIC );.    t
b140: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
b150: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
b160: 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
b170: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
b180: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
b190: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a  ITE_AFF_REAL );.
b1a0: 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d      .    zType =
b1b0: 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66   azType[pCol->af
b1c0: 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f  finity - SQLITE_
b1d0: 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20 20 6c  AFF_TEXT];.    l
b1e0: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
b1f0: 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20  en30(zType);.   
b200: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
b210: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
b220: 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20  AFF_NONE .      
b230: 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61        || pCol->a
b240: 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33  ffinity==sqlite3
b250: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79  AffinityType(zTy
b260: 70 65 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  pe) );.    memcp
b270: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79  y(&zStmt[k], zTy
b280: 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20  pe, len);.    k 
b290: 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65  += len;.    asse
b2a0: 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a  rt( k<=n );.  }.
b2b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
b2c0: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
b2d0: 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a  ], "%s", zEnd);.
b2e0: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
b2f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b300: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
b310: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
b320: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
b330: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
b340: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b350: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
b360: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
b370: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
b380: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
b390: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
b3a0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
b3b0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
b3c0: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
b3d0: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
b3e0: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
b3f0: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
b400: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
b410: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
b420: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
b430: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
b440: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
b450: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
b460: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
b470: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
b480: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
b490: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
b4a0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
b4b0: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
b4c0: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
b4d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
b4e0: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
b4f0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
b500: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
b510: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
b520: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
b530: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
b540: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
b550: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b560: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
b570: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
b580: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
b590: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
b5a0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
b5b0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
b5c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
b5d0: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
b5e0: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
b5f0: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
b600: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
b610: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
b620: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
b630: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
b640: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
b650: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
b660: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
b670: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
b680: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
b690: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
b6a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
b6b0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
b6c0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
b6d0: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
b6e0: 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
b6f0: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
b700: 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
b710: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
b720: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
b730: 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69  inal ')' token i
b740: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
b750: 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  LE */.  Select *
b760: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
b770: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
b780: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
b790: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
b7a0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
b7b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b7c0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
b7d0: 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30  ..  if( (pEnd==0
b7e0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20   && pSelect==0) 
b7f0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
b800: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
b810: 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61  n;.  }.  p = pPa
b820: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
b830: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b840: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
b850: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
b860: 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  | !pSelect );.. 
b870: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
b880: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
b890: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
b8a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b8b0: 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
b8c0: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
b8d0: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
b8e0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
b8f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
b900: 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c  heck ){.    SrcL
b910: 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20  ist sSrc;       
b920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b930: 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20  ake SrcList for 
b940: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b950: 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  e */.    NameCon
b960: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
b970: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
b980: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61   context for pPa
b990: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a  rse->pNewTable *
b9a0: 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  /..    memset(&s
b9b0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
b9c0: 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  C));.    memset(
b9d0: 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSrc, 0, sizeof
b9e0: 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72  (sSrc));.    sSr
b9f0: 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20  c.nSrc = 1;.    
ba00: 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20  sSrc.a[0].zName 
ba10: 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  = p->zName;.    
ba20: 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d  sSrc.a[0].pTab =
ba30: 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30   p;.    sSrc.a[0
ba40: 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
ba50: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
ba60: 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
ba70: 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72  .pSrcList = &sSr
ba80: 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65  c;.    sNC.isChe
ba90: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ck = 1;.    if( 
baa0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
bab0: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  prNames(&sNC, p-
bac0: 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20  >pCheck) ){.    
bad0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
bae0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
baf0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bb00: 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20  IT_CHECK) */..  
bb10: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
bb20: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
bb30: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
bb40: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
bb50: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
bb60: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
bb70: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
bb80: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
bb90: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
bba0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
bbb0: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
bbc0: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
bbd0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
bbe0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
bbf0: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
bc00: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
bc10: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
bc20: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
bc30: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
bc40: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
bc50: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
bc60: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
bc70: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70  it.busy ){.    p
bc80: 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
bc90: 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  t.newTnum;.  }..
bca0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
bcb0: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
bcc0: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
bcd0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
bce0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
bcf0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
bd00: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
bd10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
bd20: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
bd30: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
bd40: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
bd50: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
bd60: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
bd70: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
bd80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
bd90: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
bda0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
bdb0: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
bdc0: 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *v;.    char *zT
bdd0: 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77  ype;    /* "view
bde0: 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a  " or "table" */.
bdf0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32      char *zType2
be00: 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72  ;   /* "VIEW" or
be10: 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20   "TABLE" */.    
be20: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20  char *zStmt;    
be30: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43  /* Text of the C
be40: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43  REATE TABLE or C
be50: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
be60: 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d  ment */..    v =
be70: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
be80: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
be90: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
bea0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
beb0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
bec0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a   OP_Close, 0);..
bed0: 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49      /* .    ** I
bee0: 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
bef0: 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77  for the new view
bf00: 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a   or table..    *
bf10: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
bf20: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
bf30: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
bf40: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
bf50: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
bf60: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
bf70: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
bf80: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
bf90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bfa0: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
bfb0: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
bfc0: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
bfd0: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
bfe0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
bff0: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
c000: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
c010: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
c020: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
c030: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
c040: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
c050: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
c060: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
c070: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
c080: 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65  w table is in re
c090: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
c0a0: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20  egRoot..    **. 
c0b0: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
c0c0: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
c0d0: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
c0e0: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
c0f0: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
c100: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
c110: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
c120: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
c130: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
c140: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
c150: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
c160: 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63   ** A shared-cac
c170: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73  he write-lock is
c180: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
c190: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65   write to the ne
c1a0: 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  w table,.    ** 
c1b0: 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  as a schema-lock
c1c0: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
c1d0: 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  dy been obtained
c1e0: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53   to create it. S
c1f0: 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63  ince.    ** a sc
c200: 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64  hema-lock exclud
c210: 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74  es all other dat
c220: 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65  abase users, the
c230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c   write-lock woul
c240: 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75  d.    ** be redu
c250: 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndant..    */.  
c260: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
c270: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
c280: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 54 61  t dest;.      Ta
c290: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a 20  ble *pSelTab;.. 
c2a0: 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72       assert(pPar
c2b0: 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20  se->nTab==1);.  
c2c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c2d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
c2e0: 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65  Write, 1, pParse
c2f0: 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b  ->regRoot, iDb);
c300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c310: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
c320: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
c330: 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
c340: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
c350: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
c360: 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20  _Table, 1);.    
c370: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
c380: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
c390: 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73   &dest);.      s
c3a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c3b0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29  (v, OP_Close, 1)
c3c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
c3d0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
c3e0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d         pSelTab =
c3f0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
c400: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
c410: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
c420: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
c430: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
c440: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c450: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
c460: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
c470: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
c480: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
c490: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
c4a0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
c4b0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
c4c0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
c4d0: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
c4e0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53  e3DeleteTable(pS
c4f0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  elTab);.      }.
c500: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
c510: 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
c520: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
c530: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
c540: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
c550: 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
c560: 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
c570: 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  tmt(db, p);.    
c580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
c590: 20 28 69 6e 74 29 28 70 45 6e 64 2d 3e 7a 20 2d   (int)(pEnd->z -
c5a0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
c5b0: 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  ken.z) + 1;.    
c5c0: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
c5d0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20  3MPrintf(db, .  
c5e0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
c5f0: 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32  %s %.*s", zType2
c600: 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61  , n, pParse->sNa
c610: 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20  meToken.z.      
c620: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c630: 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20   A slot for the 
c640: 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61  record has alrea
c650: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
c660: 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  d in the .    **
c670: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
c680: 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e  able.  We just n
c690: 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  eed to update th
c6a0: 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c  at slot with all
c6b0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f  .    ** the info
c6c0: 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f  rmation we've co
c6d0: 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  llected..    */.
c6e0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
c6f0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
c700: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
c710: 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
c720: 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
c730: 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
c740: 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  %Q, rootpage=#%d
c750: 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20  , sql=%Q ".     
c760: 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23    "WHERE rowid=#
c770: 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  %d",.      db->a
c780: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
c790: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
c7a0: 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20  ,.      zType,. 
c7b0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
c7c0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
c7d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
c7e0: 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d  Root,.      zStm
c7f0: 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t,.      pParse-
c800: 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b  >regRowid.    );
c810: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
c820: 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20  ee(db, zStmt);. 
c830: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
c840: 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
c850: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
c860: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
c870: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43  CREMENT.    /* C
c880: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
c890: 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
c8a0: 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65   an sqlite_seque
c8b0: 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20  nce table for.  
c8c0: 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61    ** keeping tra
c8d0: 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d  ck of autoincrem
c8e0: 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f  ent keys..    */
c8f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46  .    if( p->tabF
c900: 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
c910: 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  crement ){.     
c920: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
c930: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20  aDb[iDb];.      
c940: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
c950: 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
c960: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
c970: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
c980: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
c990: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
c9a0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
c9b0: 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
c9c0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20      pDb->zName. 
c9d0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
c9e0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
c9f0: 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
ca00: 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
ca10: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
ca20: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
ca30: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
ca40: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
ca50: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
ca60: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
ca70: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
ca80: 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71  b, "tbl_name='%q
ca90: 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34  '",p->zName), P4
caa0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a  _DYNAMIC);.  }..
cab0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
cac0: 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
cad0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
cae0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
caf0: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
cb00: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
cb10: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
cb20: 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
cb30: 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
cb40: 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73  ma;.    pOld = s
cb50: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
cb60: 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  (&pSchema->tblHa
cb70: 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  sh, p->zName,.  
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb90: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
cba0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e  e3Strlen30(p->zN
cbb0: 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20 69 66 28  ame),p);.    if(
cbc0: 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
cbd0: 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
cbe0: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
cbf0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
cc00: 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
cc10: 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d  ) */.      db->m
cc20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
cc30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
cc40: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
cc50: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
cc60: 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b      db->nTable++
cc70: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
cc80: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
cc90: 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65  Changes;..#ifnde
cca0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
ccb0: 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
ccc0: 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
ccd0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
cce0: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
ccf0: 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
cd00: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
cd10: 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
cd20: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
cd30: 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
cd40: 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
cd50: 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
cd60: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
cd70: 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
cd80: 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
cd90: 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72  int)((const char
cda0: 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
cdb0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ame);.      p->a
cdc0: 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
cdd0: 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
cde0: 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
cdf0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
ce00: 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
ce10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
ce20: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
ce30: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
ce40: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
ce50: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
ce60: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
ce70: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
ce80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ce90: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
cea0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ceb0: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
cec0: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
ced0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
cee0: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
cef0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
cf00: 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
cf10: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
cf20: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
cf30: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
cf40: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
cf50: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
cf60: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
cf70: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
cf80: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
cf90: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
cfa0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
cfb0: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
cfc0: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
cfd0: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
cfe0: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
cff0: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
d000: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
d010: 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
d020: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
d030: 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
d040: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
d050: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
d060: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d070: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
d080: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
d090: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
d0a0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
d0b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d0c0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
d0d0: 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
d0e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d0f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
d100: 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
d110: 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
d120: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
d130: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
d140: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
d150: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
d160: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
d170: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
d180: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
d190: 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
d1a0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
d1b0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
d1c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
d1d0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
d1e0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
d1f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
d200: 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
d210: 3d 30 20 29 3b 20 2f 2a 20 49 66 20 73 71 6c 69  =0 ); /* If sqli
d220: 74 65 33 53 74 61 72 74 54 61 62 6c 65 20 72 65  te3StartTable re
d230: 74 75 72 6e 20 6e 6f 6e 2d 4e 55 4c 4c 20 74 68  turn non-NULL th
d240: 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 2a 2a 20 74 68 65 72 65 20 63 6f 75 6c 64 20 6e  ** there could n
d270: 6f 74 20 68 61 76 65 20 62 65 65 6e 20 61 6e 20  ot have been an 
d280: 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  error */.  sqlit
d290: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
d2a0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
d2b0: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
d2c0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
d2d0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
d2e0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69  p->pSchema);.  i
d2f0: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
d300: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
d310: 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
d320: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
d330: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
d340: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
d350: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
d360: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d370: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
d380: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
d390: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
d3a0: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
d3b0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
d3c0: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
d3d0: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
d3e0: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
d3f0: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
d400: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
d410: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
d420: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
d430: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
d440: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
d450: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
d460: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
d470: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
d480: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
d490: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
d4a0: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
d4b0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
d4c0: 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
d4d0: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
d4e0: 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  E);.  sqlite3Sel
d4f0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d500: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62  elect);.  if( db
d510: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d520: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
d530: 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  }.  if( !db->ini
d540: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
d550: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
d560: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
d570: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
d580: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
d590: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
d5a0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
d5b0: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
d5c0: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
d5d0: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
d5e0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
d5f0: 20 69 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64   if( ALWAYS(sEnd
d600: 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e  .z[0]!=0) && sEn
d610: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
d620: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
d630: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
d640: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e  n = 0;.  n = (in
d650: 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67  t)(sEnd.z - pBeg
d660: 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42  in->z);.  z = pB
d670: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
d680: 28 20 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26  ( ALWAYS(n>0) &&
d690: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
d6a0: 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
d6b0: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
d6c0: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
d6d0: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
d6e0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
d6f0: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
d700: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
d710: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
d720: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
d730: 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
d740: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  , 0);.  return;.
d750: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d760: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
d770: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d780: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
d790: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
d7a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
d7b0: 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ABLE)./*.** The 
d7c0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
d7d0: 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
d7e0: 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
d7f0: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
d800: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
d810: 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
d820: 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
d830: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
d840: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
d850: 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
d860: 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
d870: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
d880: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
d890: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
d8a0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
d8b0: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
d8c0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
d8d0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65  e){.  Table *pSe
d8e0: 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b  lTab;   /* A fak
d8f0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
d900: 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65  ch we get the re
d910: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65  sult set */.  Se
d920: 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
d930: 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53  /* Copy of the S
d940: 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65  ELECT that imple
d950: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a  ments the view *
d960: 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  /.  int nErr = 0
d970: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
d980: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
d990: 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  tered */.  int n
d9a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d9b0: 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64  Temporarily hold
d9c0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
d9d0: 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64  cursors assigned
d9e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
d9f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
da00: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
da10: 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c  nection for mall
da20: 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  oc errors */.  i
da30: 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69 64  nt (*xAuth)(void
da40: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
da50: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  *,const char*,co
da60: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
da70: 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72  char*);..  asser
da80: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69  t( pTable );..#i
da90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
daa0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
dab0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61 62   if( sqlite3Vtab
dac0: 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72  CallConnect(pPar
dad0: 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20  se, pTable) ){. 
dae0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
daf0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
db00: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
db10: 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
db20: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
db30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
db40: 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
db50: 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
db60: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
db70: 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
db80: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
db90: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
dba0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
dbb0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
dbc0: 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
dbd0: 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
dbe0: 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
dbf0: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
dc00: 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
dc10: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
dc20: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
dc30: 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
dc40: 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
dc50: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
dc60: 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
dc70: 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
dc80: 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
dc90: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
dca0: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
dcb0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
dcc0: 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
dcd0: 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
dce0: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
dcf0: 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
dd00: 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
dd10: 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
dd20: 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
dd30: 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
dd40: 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
dd50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
dd60: 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
dd70: 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
dd80: 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
dd90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
dda0: 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
ddb0: 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
ddc0: 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
ddd0: 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
dde0: 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
ddf0: 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
de00: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
de10: 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
de20: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
de30: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
de40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
de50: 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
de60: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
de70: 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
de80: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
de90: 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
dea0: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
deb0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
dec0: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
ded0: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
dee0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
def0: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
df00: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
df10: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
df20: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
df30: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
df40: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
df50: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
df60: 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
df70: 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
df80: 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
df90: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
dfa0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
dfb0: 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
dfc0: 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
dfd0: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
dfe0: 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
dff0: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
e000: 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
e010: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
e020: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
e030: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
e040: 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
e050: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
e060: 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
e070: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
e080: 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
e090: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
e0a0: 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 75 38  ( pSel ){.    u8
e0b0: 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65   enableLookaside
e0c0: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
e0d0: 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e  .bEnabled;.    n
e0e0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
e0f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
e100: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
e110: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
e120: 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Src);.    pTable
e130: 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
e140: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
e150: 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66  Enabled = 0;.#if
e160: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e170: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
e180: 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78     xAuth = db->x
e190: 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Auth;.    db->xA
e1a0: 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  uth = 0;.    pSe
e1b0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
e1c0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
e1d0: 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20  pParse, pSel);. 
e1e0: 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
e1f0: 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
e200: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
e210: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
e220: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
e230: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 62 2d  ;.#endif.    db-
e240: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e250: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b  led = enableLook
e260: 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61 72 73  aside;.    pPars
e270: 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20  e->nTab = n;.   
e280: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
e290: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e2a0: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
e2b0: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
e2c0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
e2d0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  Col;.      pTabl
e2e0: 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
e2f0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->aCol;.      p
e300: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
e310: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
e320: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
e330: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
e340: 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20  ble(pSelTab);.  
e350: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
e360: 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42  ema->flags |= DB
e370: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
e380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e390: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
e3a0: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
e3b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e3c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
e3d0: 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73  , pSel);.  } els
e3e0: 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
e3f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
e400: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
e410: 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  /.  return nErr;
e420: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
e430: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e440: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
e450: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e460: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
e470: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
e480: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
e490: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
e4a0: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
e4b0: 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
e4c0: 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
e4d0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
e4e0: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
e4f0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
e500: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
e510: 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  i;.  if( !DbHasP
e520: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
e530: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
e540: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
e550: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
e560: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
e570: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
e580: 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48  sh); i;i=sqliteH
e590: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
e5a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
e5b0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
e5c0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
e5d0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
e5e0: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
e5f0: 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20  mnNames(pTab);. 
e600: 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65     }.  }.  DbCle
e610: 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
e620: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
e630: 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ews);.}.#else.# 
e640: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65  define sqliteVie
e650: 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23  wResetAll(A,B).#
e660: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e670: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a  OMIT_VIEW */../*
e680: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
e690: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
e6a0: 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73  he VDBE to adjus
e6b0: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
e6c0: 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79  chema.** used by
e6d0: 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65   SQLite when the
e6e0: 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76   btree layer mov
e6f0: 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20  es a table root 
e700: 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f  page. The.** roo
e710: 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t-page of a tabl
e720: 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61  e or index in da
e730: 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63  tabase iDb has c
e740: 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f  hanged from iFro
e750: 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a  m.** to iTo..**.
e760: 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a  ** Ticket #1728:
e770: 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62    The symbol tab
e780: 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63  le might still c
e790: 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  ontain informati
e7a0: 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20  on.** on tables 
e7b0: 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74  and/or indices t
e7c0: 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63  hat are the proc
e7d0: 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c  ess of being del
e7e0: 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20  eted..** If you 
e7f0: 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65  are unlucky, one
e800: 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65   of those delete
e810: 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62  d indices or tab
e820: 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76  les might.** hav
e830: 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70  e the same rootp
e840: 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68  age number as th
e850: 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20  e real table or 
e860: 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a  index that is.**
e870: 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53   being moved.  S
e880: 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70  o we cannot stop
e890: 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72   searching after
e8a0: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
e8b0: 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65   .** because the
e8c0: 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67   first match mig
e8d0: 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ht be for one of
e8e0: 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64   the deleted ind
e8f0: 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65  ices.** or table
e900: 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61  s and not the ta
e910: 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69  ble/index that i
e920: 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  s actually being
e930: 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75   moved..** We mu
e940: 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70  st continue loop
e950: 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61  ing until all ta
e960: 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
e970: 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67   with.** rootpag
e980: 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65  e==iFrom have be
e990: 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  en converted to 
e9a0: 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20  have a rootpage 
e9b0: 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64  of iTo.** in ord
e9c0: 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e  er to be certain
e9d0: 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65   that we got the
e9e0: 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23   right one..*/.#
e9f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ea00: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f  IT_AUTOVACUUM.vo
ea10: 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61  id sqlite3RootPa
ea20: 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c  geMoved(Db *pDb,
ea30: 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
ea40: 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iTo){.  HashElem
ea50: 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
ea60: 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68  *pHash;..  pHash
ea70: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
ea80: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72  ->tblHash;.  for
ea90: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
eaa0: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
eab0: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
eac0: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
ead0: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
eae0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
eaf0: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
eb00: 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
eb10: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
eb20: 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
eb30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48  ;.    }.  }.  pH
eb40: 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
eb50: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
eb60: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
eb70: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
eb80: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
eb90: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
eba0: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
ebb0: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
ebc0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
ebd0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
ebe0: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
ebf0: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
ec00: 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iTo;.    }.  }.}
ec10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
ec20: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
ec30: 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
ec40: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
ec50: 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
ec60: 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
ec70: 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
ec80: 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
ec90: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
eca0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
ecb0: 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
ecc0: 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
ecd0: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
ece0: 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
ecf0: 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
ed00: 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
ed10: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
ed20: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
ed30: 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
ed40: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
ed50: 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
ed60: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
ed70: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
ed80: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
ed90: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
eda0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
edb0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
edc0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
edd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ede0: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
edf0: 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
ee00: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
ee10: 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
ee20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ee30: 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
ee40: 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
ee50: 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
ee60: 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
ee70: 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
ee80: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
ee90: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
eea0: 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
eeb0: 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
eec0: 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
eed0: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
eee0: 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
eef0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
ef00: 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
ef10: 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
ef20: 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
ef30: 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
ef40: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
ef50: 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
ef60: 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
ef70: 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
ef80: 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
ef90: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
efa0: 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
efb0: 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
efc0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
efd0: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
efe0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
eff0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
f000: 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
f010: 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
f020: 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
f030: 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
f040: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
f050: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
f060: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
f070: 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
f080: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
f090: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f0a0: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
f0b0: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
f0c0: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
f0d0: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
f0e0: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
f0f0: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
f100: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
f110: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f120: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
f130: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
f140: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
f150: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
f160: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
f170: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
f180: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
f190: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
f1a0: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
f1b0: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
f1c0: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
f1d0: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
f1e0: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
f1f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
f200: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
f210: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
f220: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
f230: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
f240: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
f250: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
f260: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
f270: 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
f280: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
f290: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
f2a0: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
f2b0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
f2c0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
f2d0: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
f2e0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
f2f0: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
f300: 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
f310: 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
f320: 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
f330: 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
f340: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
f350: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
f360: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
f370: 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
f380: 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
f390: 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
f3a0: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
f3b0: 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
f3c0: 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
f3d0: 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
f3e0: 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
f3f0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
f400: 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
f410: 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
f420: 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
f430: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
f440: 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
f450: 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
f460: 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
f470: 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
f480: 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
f490: 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
f4a0: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
f4b0: 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
f4c0: 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
f4d0: 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
f4e0: 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
f4f0: 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
f500: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
f510: 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
f520: 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
f530: 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
f540: 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
f550: 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
f560: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
f570: 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
f580: 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
f590: 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
f5a0: 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
f5b0: 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
f5c0: 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
f5d0: 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
f5e0: 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
f5f0: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
f600: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
f610: 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
f620: 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
f630: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
f640: 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
f650: 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
f660: 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
f670: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
f680: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
f690: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
f6a0: 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
f6b0: 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
f6c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
f6d0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
f6e0: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
f6f0: 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
f700: 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
f710: 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
f720: 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
f730: 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
f740: 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
f750: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
f760: 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
f770: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
f780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
f790: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
f7a0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
f7b0: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
f7c0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73  hema);.      des
f7d0: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
f7e0: 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
f7f0: 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
f800: 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
f810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
f820: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
f830: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
f840: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
f850: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
f860: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
f870: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
f880: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
f890: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
f8a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
f8b0: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
f8c0: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
f8d0: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
f8e0: 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
f8f0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
f900: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
f910: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
f920: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
f930: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f940: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
f950: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
f960: 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
f970: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
f980: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f990: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
f9a0: 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
f9b0: 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b  b->suppressErr++
f9c0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
f9d0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
f9e0: 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 0a 20  arse, isView, . 
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa00: 20 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65             pName
fa10: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
fa20: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
fa30: 61 73 65 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72  ase);.  if( noEr
fa40: 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r ) db->suppress
fa50: 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54  Err--;..  if( pT
fa60: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  ab==0 ){.    got
fa70: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
fa80: 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  e;.  }.  iDb = s
fa90: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
faa0: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
fab0: 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
fac0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
fad0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a  db->nDb );..  /*
fae0: 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
faf0: 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c  rtual table, cal
fb00: 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  l ViewGetColumnN
fb10: 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65  ames() to ensure
fb20: 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74  .  ** it is init
fb30: 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
fb40: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
fb50: 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69  ab) && sqlite3Vi
fb60: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
fb70: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
fb80: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
fb90: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
fba0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fbb0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
fbc0: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
fbd0: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
fbe0: 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
fbf0: 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
fc00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
fc10: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
fc20: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
fc30: 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20  t char *zArg2 = 
fc40: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
fc50: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
fc60: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
fc70: 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
fc80: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
fc90: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
fca0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
fcb0: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
fcc0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
fcd0: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
fce0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
fcf0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
fd00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fd10: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
fd20: 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
fd30: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
fd40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
fd50: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
fd60: 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
fd70: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
fd80: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
fd90: 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  P_VTABLE;.      
fda0: 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47  zArg2 = sqlite3G
fdb0: 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
fdc0: 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  b)->pMod->zName;
fdd0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
fde0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
fdf0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
fe00: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
fe10: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
fe20: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
fe30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fe40: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
fe50: 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
fe60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
fe70: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
fe80: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
fe90: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
fea0: 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
feb0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
fec0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
fed0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
fee0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
fef0: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
ff00: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
ff10: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
ff20: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
ff30: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
ff40: 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
ff50: 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
ff60: 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
ff70: 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
ff80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ff90: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
ffa0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
ffb0: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
ffc0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
ffd0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
ffe0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
fff0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
10000 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
10010 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
10020 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
10030 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
10040 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
10050 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
10060 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
10070 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
10080 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10090 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
100a0 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
100b0 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
100c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
100d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
100e0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
100f0 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
10100 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
10110 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10120 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
10130 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
10140 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
10150 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
10160 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
10170 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
10180 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
10190 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
101a0 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
101b0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
101c0 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
101d0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
101e0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
101f0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
10200 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
10210 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
10220 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
10230 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
10240 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
10250 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
10260 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10270 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
10280 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
10290 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
102a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
102b0 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
102c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
102d0 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70     sqlite3FkDrop
102e0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
102f0 61 6d 65 2c 20 70 54 61 62 29 3b 0a 0a 20 20 20  ame, pTab);..   
10300 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
10310 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
10320 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
10330 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
10340 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65  ode.    ** is ge
10350 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
10360 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
10370 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
10380 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  /or.    ** sqlit
10390 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
103a0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
103b0 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
103c0 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c   sqlite3TriggerL
103d0 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
103e0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  );.    while( pT
103f0 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
10400 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
10410 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
10420 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
10430 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
10440 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
10450 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
10460 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f        sqlite3Dro
10470 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
10480 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  se, pTrigger);. 
10490 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
104a0 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
104b0 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
104c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
104d0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
104e0 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72   Remove any entr
104f0 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ies of the sqlit
10500 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
10510 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10520 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
10530 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
10540 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
10550 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
10560 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a  s dropped.    **
10570 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65   at the btree le
10580 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65  vel, in case the
10590 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
105a0 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a   table needs to.
105b0 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61      ** move as a
105c0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
105d0 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
105e0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
105f0 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ode)..    */.   
10600 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
10610 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
10620 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  rement ){.      
10630 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
10640 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
10650 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
10660 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %s.sqlite_sequen
10670 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
10680 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ",.        pDb->
10690 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
106a0 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
106b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
106c0 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
106d0 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
106e0 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
106f0 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
10700 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20  e.    ** table. 
10710 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
10720 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
10730 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
10740 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20  and deletes.    
10750 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
10760 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
10770 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
10780 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
10790 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f  being.    ** dro
107a0 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61  pped. Triggers a
107b0 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72  re handled seper
107c0 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20  ately because a 
107d0 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20  trigger can be. 
107e0 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e     ** created in
107f0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
10800 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
10810 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
10820 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61  ther.    ** data
10830 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
10840 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
10850 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
10860 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
10870 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
10880 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
10890 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
108a0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
108b0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
108c0 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  (iDb), pTab->zNa
108d0 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  me);..    /* Dro
108e0 70 20 61 6e 79 20 73 74 61 74 69 73 74 69 63 73  p any statistics
108f0 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
10900 5f 73 74 61 74 31 20 74 61 62 6c 65 2c 20 69 66  _stat1 table, if
10910 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
10920 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
10930 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69  dTable(db, "sqli
10940 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61  te_stat1", db->a
10950 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29  Db[iDb].zName) )
10960 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
10970 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10980 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
10990 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
109a0 65 5f 73 74 61 74 31 20 57 48 45 52 45 20 74 62  e_stat1 WHERE tb
109b0 6c 3d 25 51 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d  l=%Q", pDb->zNam
109c0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
109d0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
109e0 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26     if( !isView &
109f0 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
10a00 62 29 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74  b) ){.      dest
10a10 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
10a20 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20   pTab);.    }.. 
10a30 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
10a40 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f   table entry fro
10a50 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72  m SQLite's inter
10a60 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d  nal schema and m
10a70 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65  odify.    ** the
10a80 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
10a90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
10aa0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
10ab0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10ac0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10ad0 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
10ae0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
10af0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
10b00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b10 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  4(v, OP_DropTabl
10b20 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  e, iDb, 0, 0, pT
10b30 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
10b40 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
10b50 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
10b60 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
10b70 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
10b80 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
10b90 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
10ba0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
10bb0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
10bc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10bd0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
10be0 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
10bf0 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
10c00 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
10c10 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
10c20 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
10c30 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
10c40 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
10c50 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
10c60 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
10c70 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
10c80 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
10c90 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
10ca0 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
10cb0 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
10cc0 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
10cd0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
10ce0 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
10cf0 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
10d00 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
10d10 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
10d20 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
10d30 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
10d40 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
10d50 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
10d60 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
10d70 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
10d80 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
10d90 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
10da0 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
10db0 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
10dc0 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
10dd0 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
10de0 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
10df0 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
10e00 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
10e10 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
10e20 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
10e30 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
10e40 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ble field..**.**
10e50 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
10e60 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
10e70 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
10e80 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
10e90 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
10ea0 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
10eb0 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
10ec0 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
10ed0 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
10ee0 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
10ef0 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
10f00 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
10f10 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10f20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
10f30 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
10f40 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
10f50 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
10f60 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
10f70 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
10f80 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
10f90 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
10fa0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10fb0 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
10fc0 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
10fd0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
10fe0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
10ff0 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
11000 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
11010 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  hms. */.){.  sql
11020 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11030 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
11040 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
11050 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
11060 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79  FKey = 0;.  FKey
11070 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62   *pNextTo;.  Tab
11080 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
11090 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
110a0 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
110b0 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
110c0 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
110d0 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
110e0 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  f( p==0 || IN_DE
110f0 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
11100 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
11110 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
11120 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
11130 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
11140 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29   NEVER(iCol<0) )
11150 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11160 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
11170 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
11180 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11190 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
111a0 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
111b0 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
111c0 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
111d0 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
111e0 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
111f0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
11200 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
11210 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
11220 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
11230 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
11240 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
11250 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
11260 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
11270 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11280 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
11290 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
112a0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
112b0 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
112c0 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
112d0 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
112e0 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
112f0 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
11300 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
11310 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
11320 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
11330 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
11340 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
11350 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31  pFKey) + (nCol-1
11360 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  )*sizeof(pFKey->
11370 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
11380 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
11390 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
113a0 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
113b0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
113c0 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
113d0 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
113e0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
113f0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
11400 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62  FKey = sqlite3Db
11410 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
11420 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
11430 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  Key==0 ){.    go
11440 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
11450 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
11460 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
11470 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
11480 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
11490 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c  pFKey->aCol[nCol
114a0 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  ];.  pFKey->zTo 
114b0 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
114c0 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
114d0 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
114e0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
114f0 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70  ote(z);.  z += p
11500 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
11510 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
11520 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
11530 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
11540 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
11550 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
11560 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
11570 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11580 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
11590 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
115a0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
115b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
115c0 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
115d0 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
115e0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
115f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
11600 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
11610 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
11620 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11630 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11640 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
11650 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11660 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11670 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
11680 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
11690 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
116a0 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
116b0 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
116c0 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
116d0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
116e0 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
116f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11700 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
11710 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
11720 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
11730 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
11740 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
11750 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
11760 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
11770 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
11780 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
11790 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
117a0 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
117b0 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
117c0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
117d0 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
117e0 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  ;.  pFKey->aActi
117f0 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61  on[0] = (u8)(fla
11800 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20  gs & 0xff);     
11810 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c         /* ON DEL
11820 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ETE action */.  
11830 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31  pFKey->aAction[1
11840 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20  ] = (u8)((flags 
11850 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20  >> 8 ) & 0xff); 
11860 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20     /* ON UPDATE 
11870 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 70 4e 65  action */..  pNe
11880 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73  xtTo = (FKey *)s
11890 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
118a0 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b  (&p->pSchema->fk
118b0 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70  eyHash, .      p
118c0 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71 6c 69 74  FKey->zTo, sqlit
118d0 65 33 53 74 72 6c 65 6e 33 30 28 70 46 4b 65 79  e3Strlen30(pFKey
118e0 2d 3e 7a 54 6f 29 2c 20 28 76 6f 69 64 20 2a 29  ->zTo), (void *)
118f0 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28  pFKey.  );.  if(
11900 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20   pNextTo==pFKey 
11910 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
11920 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
11930 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11940 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20  }.  if( pNextTo 
11950 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
11960 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d  NextTo->pPrevTo=
11970 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 );.    pFKey-
11980 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74  >pNextTo = pNext
11990 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d  To;.    pNextTo-
119a0 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79  >pPrevTo = pFKey
119b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
119c0 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
119d0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73   to the table as
119e0 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a   the last step..
119f0 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20    */.  p->pFKey 
11a00 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79  = pFKey;.  pFKey
11a10 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20   = 0;..fk_end:. 
11a20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11a30 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  b, pFKey);.#endi
11a40 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
11a50 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
11a60 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
11a70 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
11a80 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b  e(db, pFromCol);
11a90 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
11aa0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  stDelete(db, pTo
11ab0 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
11ac0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
11ad0 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e  alled when an IN
11ae0 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
11af0 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44  E or INITIALLY D
11b00 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73  EFERRED.** claus
11b10 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72  e is seen as par
11b20 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b  t of a foreign k
11b30 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  ey definition.  
11b40 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a  The isDeferred.*
11b50 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31  * parameter is 1
11b60 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44   for INITIALLY D
11b70 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f  EFERRED and 0 fo
11b80 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  r INITIALLY IMME
11b90 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65  DIATE..** The be
11ba0 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f  havior of the mo
11bb0 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
11bc0 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ted foreign key 
11bd0 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
11be0 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76  ccordingly..*/.v
11bf0 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72  oid sqlite3Defer
11c00 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
11c10 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
11c20 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64  Deferred){.#ifnd
11c30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
11c40 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62  OREIGN_KEY.  Tab
11c50 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
11c60 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
11c70 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
11c80 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
11c90 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
11ca0 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
11cb0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44  n;.  assert( isD
11cc0 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73  eferred==0 || is
11cd0 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f  Deferred==1 ); /
11ce0 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31  * EV: R-30323-21
11cf0 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  917 */.  pFKey->
11d00 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38  isDeferred = (u8
11d10 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e  )isDeferred;.#en
11d20 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
11d30 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
11d40 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
11d50 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
11d60 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
11d70 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
11d80 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
11d90 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
11da0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
11db0 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
11dc0 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
11dd0 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
11de0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
11df0 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
11e00 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
11e10 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
11e20 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
11e30 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67  reated.  The reg
11e40 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20  ister specified 
11e50 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63  by memRootPage c
11e60 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72  ontains the.** r
11e70 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
11e80 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  of the index.  I
11e90 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
11ea0 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a   negative, then.
11eb0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  ** the index alr
11ec0 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20  eady exists and 
11ed0 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20  must be cleared 
11ee0 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66  before being ref
11ef0 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  illed and.** the
11f00 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
11f10 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
11f20 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e  s taken from pIn
11f30 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74  dex->tnum..*/.st
11f40 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
11f50 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72  3RefillIndex(Par
11f60 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
11f70 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d  x *pIndex, int m
11f80 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54  emRootPage){.  T
11f90 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
11fa0 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
11fb0 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
11fc0 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
11fd0 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
11fe0 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
11ff0 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
12000 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
12010 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
12020 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
12030 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
12040 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
12050 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
12060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12070 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12080 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
12090 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20  /.  int tnum;   
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
120c0 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  of index */.  Vd
120d0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
120f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
12100 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
12110 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79  machine */.  Key
12120 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20  Info *pKey;     
12130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
12140 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78  eyInfo for index
12150 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 64 78   */.  int regIdx
12160 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
12170 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
12180 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  s containing the
12190 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
121a0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
121c0 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
121d0 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69 6e  ng assemblied in
121e0 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
121f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
12200 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f  arse->db;      /
12210 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
12220 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
12230 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
12240 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
12250 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
12260 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
12270 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
12280 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c  ZATION.  if( sql
12290 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
122a0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49  arse, SQLITE_REI
122b0 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NDEX, pIndex->zN
122c0 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62  ame, 0,.      db
122d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
122e0 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   ) ){.    return
122f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
12300 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69  /* Require a wri
12310 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74  te-lock on the t
12320 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20  able to perform 
12330 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a  this operation *
12340 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  /.  sqlite3Table
12350 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
12360 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c  , pTab->tnum, 1,
12370 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
12380 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12390 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
123a0 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
123b0 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  n;.  if( memRoot
123c0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74  Page>=0 ){.    t
123d0 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67  num = memRootPag
123e0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
123f0 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
12400 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  num;.    sqlite3
12410 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12420 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
12430 62 29 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d  b);.  }.  pKey =
12440 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
12450 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e  info(pParse, pIn
12460 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dex);.  sqlite3V
12470 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12480 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
12490 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
124c0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
124d0 46 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  F);.  if( memRoo
124e0 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
124f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12500 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 7d 0a 20  eP5(v, 1);.  }. 
12510 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
12520 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
12530 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
12540 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31  enRead);.  addr1
12550 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12560 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
12570 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 72  d, iTab, 0);.  r
12580 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
12590 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
125a0 72 73 65 29 3b 0a 20 20 72 65 67 49 64 78 4b 65  rse);.  regIdxKe
125b0 79 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72  y = sqlite3Gener
125c0 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
125d0 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62  se, pIndex, iTab
125e0 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b  , regRecord, 1);
125f0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
12600 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
12610 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
12620 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 49   regRowid = regI
12630 64 78 4b 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e  dxKey + pIndex->
12640 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e  nColumn;.    con
12650 73 74 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69  st int j2 = sqli
12660 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
12670 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 76  dr(v) + 2;.    v
12680 6f 69 64 20 2a 20 63 6f 6e 73 74 20 70 52 65 67  oid * const pReg
12690 4b 65 79 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  Key = SQLITE_INT
126a0 5f 54 4f 5f 50 54 52 28 72 65 67 49 64 78 4b 65  _TO_PTR(regIdxKe
126b0 79 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  y);..    /* The 
126c0 72 65 67 69 73 74 65 72 73 20 61 63 63 65 73 73  registers access
126d0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55  ed by the OP_IsU
126e0 6e 69 71 75 65 20 6f 70 63 6f 64 65 20 77 65 72  nique opcode wer
126f0 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  e allocated.    
12700 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ** using sqlite3
12710 47 65 74 54 65 6d 70 52 61 6e 67 65 28 29 20 69  GetTempRange() i
12720 6e 73 69 64 65 20 6f 66 20 74 68 65 20 73 71 6c  nside of the sql
12730 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
12740 78 4b 65 79 28 29 0a 20 20 20 20 2a 2a 20 63 61  xKey().    ** ca
12750 6c 6c 20 61 62 6f 76 65 2e 20 4a 75 73 74 20 62  ll above. Just b
12760 65 66 6f 72 65 20 74 68 61 74 20 66 75 6e 63 74  efore that funct
12770 69 6f 6e 20 77 61 73 20 66 72 65 65 64 20 74 68  ion was freed th
12780 65 79 20 77 65 72 65 20 72 65 6c 65 61 73 65 64  ey were released
12790 0a 20 20 20 20 2a 2a 20 28 6d 61 64 65 20 61 76  .    ** (made av
127a0 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 63  ailable to the c
127b0 6f 6d 70 69 6c 65 72 20 66 6f 72 20 72 65 75 73  ompiler for reus
127c0 65 29 20 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a  e) using .    **
127d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
127e0 65 6d 70 52 61 6e 67 65 28 29 2e 20 53 6f 20 69  empRange(). So i
127f0 6e 20 73 6f 6d 65 20 77 61 79 73 20 68 61 76 69  n some ways havi
12800 6e 67 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71  ng the OP_IsUniq
12810 75 65 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65  ue.    ** opcode
12820 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 73 20   use the values 
12830 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 73 65  stored within se
12840 65 6d 73 20 64 61 6e 67 65 72 6f 75 73 2e 20 48  ems dangerous. H
12850 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 0a 20 20  owever, since.  
12860 20 20 2a 2a 20 77 65 20 63 61 6e 20 62 65 20 73    ** we can be s
12870 75 72 65 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ure that no othe
12880 72 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73  r temp registers
12890 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
128a0 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 69 6e 63  ated.    ** sinc
128b0 65 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  e sqlite3Release
128c0 54 65 6d 70 52 61 6e 67 65 28 29 20 77 61 73 20  TempRange() was 
128d0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 73 61  called, it is sa
128e0 66 65 20 74 6f 20 64 6f 20 73 6f 2e 0a 20 20 20  fe to do so..   
128f0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
12900 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12910 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c 20  IsUnique, iIdx, 
12920 6a 32 2c 20 72 65 67 52 6f 77 69 64 2c 20 70 52  j2, regRowid, pR
12930 65 67 4b 65 79 2c 20 50 34 5f 49 4e 54 33 32 29  egKey, P4_INT32)
12940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c  ;.    sqlite3Hal
12950 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 20  tConstraint(.   
12960 20 20 20 20 20 70 50 61 72 73 65 2c 20 4f 45 5f       pParse, OE_
12970 41 62 6f 72 74 2c 20 22 69 6e 64 65 78 65 64 20  Abort, "indexed 
12980 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20  columns are not 
12990 75 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54  unique", P4_STAT
129a0 49 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  IC);.  }.  sqlit
129b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
129c0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
129d0 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
129e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
129f0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
12a00 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
12a10 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12a20 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12a30 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
12a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12a50 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
12a60 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71  , addr1+1);.  sq
12a70 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12a80 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73  e(v, addr1);.  s
12a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12aa0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
12ab0 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ab);.  sqlite3Vd
12ac0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
12ad0 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a  lose, iIdx);.}..
12ae0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
12af0 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
12b00 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
12b10 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
12b20 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
12b30 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
12b40 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
12b50 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
12b60 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
12b70 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
12b80 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
12b90 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
12ba0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
12bb0 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
12bc0 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
12bd0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
12be0 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
12bf0 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
12c00 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
12c10 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
12c20 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
12c30 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
12c40 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
12c50 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
12c60 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
12c70 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
12c80 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
12c90 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
12ca0 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
12cb0 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
12cc0 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
12cd0 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
12ce0 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
12cf0 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
12d00 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
12d10 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
12d20 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
12d30 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
12d40 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
12d50 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  tion.  .**.** If
12d60 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 72   the index is cr
12d70 65 61 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  eated successful
12d80 6c 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ly, return a poi
12d90 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
12da0 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74 75  Index.** structu
12db0 72 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  re. This is used
12dc0 20 62 79 20 73 71 6c 69 74 65 33 41 64 64 50 72   by sqlite3AddPr
12dd0 69 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d 61  imaryKey() to ma
12de0 72 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  rk the index.** 
12df0 61 73 20 74 68 65 20 74 61 62 6c 65 73 20 70 72  as the tables pr
12e00 69 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65 78  imary key (Index
12e10 2e 61 75 74 6f 49 6e 64 65 78 3d 3d 32 29 2e 0a  .autoIndex==2)..
12e20 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
12e30 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
12e40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12e50 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
12e60 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
12e70 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
12e80 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
12e90 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
12ea0 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
12eb0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
12ec0 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
12ed0 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
12ee0 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
12ef0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
12f00 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
12f10 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
12f20 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
12f30 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
12f40 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
12f50 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
12f60 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
12f70 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
12f80 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
12f90 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
12fa0 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
12fb0 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
12fc0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
12fd0 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
12fe0 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
12ff0 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73  at begins this s
13000 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
13010 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
13020 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
13030 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
13040 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
13050 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
13060 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f  Order,     /* So
13070 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d  rt order of prim
13080 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69  ary key when pLi
13090 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  st==NULL */.  in
130a0 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20  t ifNotExist    
130b0 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69   /* Omit error i
130c0 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  f index already 
130d0 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 49  exists */.){.  I
130e0 6e 64 65 78 20 2a 70 52 65 74 20 3d 20 30 3b 20  ndex *pRet = 0; 
130f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
13100 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 54 61  o return */.  Ta
13110 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
13120 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
13130 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
13140 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30  ndex *pIndex = 0
13150 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
13160 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
13170 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
13180 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  = 0;     /* Name
13190 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
131a0 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
131b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
131c0 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
131d0 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e  in zName */.  in
131e0 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20  t i, j;.  Token 
131f0 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 2f  nullId;        /
13200 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72  * Fake token for
13210 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73   an empty ID lis
13220 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73  t */.  DbFixer s
13230 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Fix;        /* F
13240 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
13250 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
13260 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  Table */.  int s
13270 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20  ortOrderMask;   
13280 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45  /* 1 to honor DE
13290 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20  SC in index.  0 
132a0 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20  to ignore. */.  
132b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
132c0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a  arse->db;.  Db *
132d0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
132e0 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
132f0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
13300 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61  g the indexed da
13310 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
13320 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
13330 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
13340 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
13350 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
13360 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
13370 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71  e = 0;    /* Unq
13380 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
13390 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
133a0 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  eate */.  struct
133b0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
133c0 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f  pListItem; /* Fo
133d0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
133e0 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  List */.  int nC
133f0 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  ol;.  int nExtra
13400 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45   = 0;.  char *zE
13410 78 74 72 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  xtra;..  assert(
13420 20 70 53 74 61 72 74 3d 3d 30 20 7c 7c 20 70 45   pStart==0 || pE
13430 6e 64 21 3d 30 20 29 3b 20 2f 2a 20 70 45 6e 64  nd!=0 ); /* pEnd
13440 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c   must be non-NUL
13450 4c 20 69 66 20 70 53 74 61 72 74 20 69 73 20 2a  L if pStart is *
13460 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
13470 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
13480 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c      /* Never cal
13490 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
134a0 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
134b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
134c0 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
134d0 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  AB ){.    goto e
134e0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
134f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
13500 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
13510 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
13520 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
13530 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13540 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
13550 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
13560 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
13570 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
13580 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
13590 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
135a0 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
135b0 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
135c0 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
135d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
135e0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
135f0 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
13600 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
13610 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
13620 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
13630 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
13640 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
13650 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
13660 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
13670 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
13680 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
13690 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
136a0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
136b0 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
136c0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
136d0 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e  ate_index;..#ifn
136e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
136f0 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
13700 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
13710 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
13720 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68   check if the th
13730 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
13740 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
13750 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
13760 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f  atabase to 1. Do
13770 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20   not do this.   
13780 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73   ** if initialis
13790 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73  ing a database s
137a0 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20  chema..    */.  
137b0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
137c0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54  busy ){.      pT
137d0 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
137e0 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
137f0 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20  , pTblName);.   
13800 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e     if( pName2->n
13810 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70  ==0 && pTab && p
13820 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  Tab->pSchema==db
13830 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
13840 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20   ){.        iDb 
13850 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
13860 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
13870 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
13880 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
13890 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
138a0 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
138b0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
138c0 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
138d0 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
138e0 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   /* Because the 
138f0 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74  parser construct
13900 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20  s pTblName from 
13910 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
13920 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71  ier,.      ** sq
13930 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20  lite3FixSrcList 
13940 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20  can never fail. 
13950 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
13960 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  0);.    }.    pT
13970 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
13980 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
13990 30 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  0, pTblName->a[0
139a0 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
139b0 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d    pTblName->a[0]
139c0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
139d0 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 64 62   if( !pTab || db
139e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
139f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13a00 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
13a10 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
13a20 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ].pSchema==pTab-
13a30 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65  >pSchema );.  }e
13a40 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
13a50 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
13a60 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   pTab = pParse->
13a70 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69  pNewTable;.    i
13a80 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
13a90 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13aa0 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  x;.    iDb = sql
13ab0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13ac0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
13ad0 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20  ema);.  }.  pDb 
13ae0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
13af0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
13b00 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
13b10 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
13b20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
13b30 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
13b40 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
13b50 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  , 7)==0 .       
13b60 26 26 20 6d 65 6d 63 6d 70 28 26 70 54 61 62 2d  && memcmp(&pTab-
13b70 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72  >zName[7],"alter
13b80 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20  tab_",9)!=0 ){. 
13b90 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13ba0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
13bb0 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
13bc0 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
13bd0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
13be0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13bf0 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
13c00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13c10 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
13c20 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
13c30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13c40 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
13c50 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
13c60 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13c70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13c80 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
13c90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13ca0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
13cb0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
13cc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13cd0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
13ce0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61  irtual tables ma
13cf0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
13d00 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
13d10 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13d20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13d30 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
13d40 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
13d50 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
13d60 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
13d70 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
13d80 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
13d90 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
13da0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
13db0 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
13dc0 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
13dd0 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
13de0 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
13df0 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
13e00 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
13e10 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
13e20 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
13e30 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
13e40 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
13e50 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
13e60 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
13e70 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
13e80 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
13e90 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
13ea0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
13eb0 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
13ec0 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
13ed0 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
13ee0 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
13ef0 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
13f00 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
13f10 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
13f20 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
13f30 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
13f40 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
13f50 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
13f60 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
13f70 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
13f80 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
13f90 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
13fa0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13fb0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
13fc0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
13fd0 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
13fe0 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
13ff0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14000 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14020 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
14030 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
14040 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
14050 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
14060 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14070 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14080 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
14090 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
140a0 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
140b0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
140c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
140d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
140e0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
140f0 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
14100 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  pDb->zName)!=0 )
14110 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e  {.      if( !ifN
14120 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20  otExist ){.     
14130 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14140 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
14150 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
14160 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
14170 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
14180 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14190 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
141a0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
141b0 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
141c0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
141d0 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
141e0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
141f0 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
14200 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
14210 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
14220 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
14230 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
14240 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
14250 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
14260 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14270 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14280 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
14290 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
142a0 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
142b0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
142c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
142d0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
142e0 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
142f0 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
14300 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  >zName;.    if( 
14310 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14320 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14330 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
14340 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
14350 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
14360 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14370 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
14380 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
14390 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
143a0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
143b0 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
143c0 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
143d0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
143e0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
143f0 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
14400 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
14410 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
14420 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14430 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
14440 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
14450 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
14460 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
14470 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
14480 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
14490 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
144a0 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
144b0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
144c0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
144d0 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
144e0 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
144f0 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
14500 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
14510 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
14520 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
14530 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
14540 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
14550 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
14560 6e 33 30 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49  n30((char*)nullI
14570 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
14580 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
14590 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
145a0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
145b0 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
145c0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
145d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
145e0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
145f0 72 73 65 2c 20 70 4c 69 73 74 2c 20 26 6e 75 6c  rse, pList, &nul
14600 6c 49 64 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  lId, 0);.    pLi
14610 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
14620 65 72 20 3d 20 28 75 38 29 73 6f 72 74 4f 72 64  er = (u8)sortOrd
14630 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  er;.  }..  /* Fi
14640 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
14650 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  y bytes of space
14660 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
14670 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c   store explicitl
14680 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  y.  ** specified
14690 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
146a0 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  nce names..  */.
146b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
146c0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
146d0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
146e0 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
146f0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
14700 78 70 72 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  xpr ){.      Col
14710 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45  lSeq *pColl = pE
14720 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
14730 20 20 2f 2a 20 45 69 74 68 65 72 20 70 43 6f 6c    /* Either pCol
14740 6c 21 3d 30 20 6f 72 20 74 68 65 72 65 20 77 61  l!=0 or there wa
14750 73 20 61 6e 20 4f 4f 4d 20 66 61 69 6c 75 72 65  s an OOM failure
14760 2e 20 20 42 75 74 20 69 66 20 61 6e 20 4f 4f 4d  .  But if an OOM
14770 0a 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 75 72  .      ** failur
14780 65 20 77 65 20 68 61 76 65 20 71 75 69 74 20 62  e we have quit b
14790 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20 74  efore reaching t
147a0 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
147b0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
147c0 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  Coll) ){.       
147d0 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
147e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
147f0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  pColl->zName));.
14800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14810 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
14820 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
14830 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
14840 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
14850 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
14860 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69  e);.  nCol = pLi
14870 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
14880 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  dex = sqlite3DbM
14890 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20  allocZero(db, . 
148a0 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64 65       sizeof(Inde
148b0 78 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  x) +            
148c0 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
148d0 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 73  ture  */.      s
148e0 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20  izeof(int)*nCol 
148f0 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  +           /* I
14900 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
14910 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14920 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  int)*(nCol+1) + 
14930 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
14940 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20  iRowEst   */.   
14950 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a     sizeof(char *
14960 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
14970 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
14980 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a      */.      siz
14990 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20  eof(u8)*nCol +  
149a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
149b0 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
149c0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31  .      nName + 1
149d0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
149e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61      /* Index.zNa
149f0 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  me      */.     
14a00 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a20 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
14a30 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29  nce names */.  )
14a40 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
14a50 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14a60 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14a70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
14a80 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  ndex->azColl = (
14a90 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b  char**)(&pIndex[
14aa0 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  1]);.  pIndex->a
14ab0 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a  iColumn = (int *
14ac0 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  )(&pIndex->azCol
14ad0 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64  l[nCol]);.  pInd
14ae0 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28  ex->aiRowEst = (
14af0 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e  unsigned *)(&pIn
14b00 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
14b10 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ol]);.  pIndex->
14b20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
14b30 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52   *)(&pIndex->aiR
14b40 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a  owEst[nCol+1]);.
14b50 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
14b60 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
14b70 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ex->aSortOrder[n
14b80 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20  Col]);.  zExtra 
14b90 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
14ba0 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b  ex->zName[nName+
14bb0 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49  1]);.  memcpy(pI
14bc0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
14bd0 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
14be0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
14bf0 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
14c00 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
14c10 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
14c20 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
14c30 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
14c40 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
14c50 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a  (u8)(pName==0);.
14c60 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
14c70 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
14c80 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20  .pSchema;..  /* 
14c90 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
14ca0 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20  we should honor 
14cb0 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e  DESC requests on
14cc0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20   index columns. 
14cd0 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70   */.  if( pDb->p
14ce0 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
14cf0 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f  mat>=4 ){.    so
14d00 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31  rtOrderMask = -1
14d10 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53  ;   /* Honor DES
14d20 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  C */.  }else{.  
14d30 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
14d40 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72  = 0;    /* Ignor
14d50 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20  e DESC */.  }.. 
14d60 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
14d70 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
14d80 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
14d90 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
14da0 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
14db0 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
14dc0 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
14dd0 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
14de0 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
14df0 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
14e00 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20  ot found..  **. 
14e10 20 2a 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61   ** TODO:  Add a
14e20 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   test to make su
14e30 72 65 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  re that the same
14e40 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e   column is not n
14e50 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74  amed.  ** more t
14e60 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20  han once within 
14e70 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20  the same index. 
14e80 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
14e90 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a  instance of.  **
14ea0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c   the column will
14eb0 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79   ever be used by
14ec0 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
14ed0 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67   Note that using
14ee0 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63   the.  ** same c
14ef0 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20  olumn more than 
14f00 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61  once cannot be a
14f10 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
14f20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  that would .  **
14f30 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73   break backwards
14f40 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
14f50 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
14f60 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  a warning..  */.
14f70 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
14f80 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
14f90 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
14fa0 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
14fb0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
14fc0 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69   *zColName = pLi
14fd0 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  stItem->zName;. 
14fe0 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43     Column *pTabC
14ff0 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75  ol;.    int requ
15000 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
15010 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
15040 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
15050 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70  ..    for(j=0, p
15060 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
15070 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; j<pTab->nCol;
15080 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   j++, pTabCol++)
15090 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
150a0 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e  te3StrICmp(zColN
150b0 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e  ame, pTabCol->zN
150c0 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
150d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
150e0 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
150f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15100 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
15110 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63  able %s has no c
15120 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c  olumn named %s",
15130 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
15140 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b  Name, zColName);
15150 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
15160 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
15170 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15180 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15190 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
151a0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
151b0 0a 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63  .    /* Justific
151c0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 41 4c 57  ation of the ALW
151d0 41 59 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  AYS(pListItem->p
151e0 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 3a 20 20 42  Expr->pColl):  B
151f0 65 63 61 75 73 65 20 6f 66 0a 20 20 20 20 2a 2a  ecause of.    **
15200 20 74 68 65 20 77 61 79 20 74 68 65 20 22 69 64   the way the "id
15210 78 6c 69 73 74 22 20 6e 6f 6e 2d 74 65 72 6d 69  xlist" non-termi
15220 6e 61 6c 20 69 73 20 63 6f 6e 73 74 72 75 63 74  nal is construct
15230 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
15240 2c 0a 20 20 20 20 2a 2a 20 69 66 20 70 4c 69 73  ,.    ** if pLis
15250 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 69 73 20  tItem->pExpr is 
15260 6e 6f 74 20 6e 75 6c 6c 20 74 68 65 6e 20 65 69  not null then ei
15270 74 68 65 72 20 70 4c 69 73 74 49 74 65 6d 2d 3e  ther pListItem->
15280 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 0a 20 20 20  pExpr->pColl.   
15290 20 2a 2a 20 6d 75 73 74 20 65 78 69 73 74 20 6f   ** must exist o
152a0 72 20 65 6c 73 65 20 74 68 65 72 65 20 6d 75 73  r else there mus
152b0 74 20 68 61 76 65 20 62 65 65 6e 20 61 6e 20 4f  t have been an O
152c0 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 69  OM error.  But i
152d0 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20 77  f there.    ** w
152e0 61 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2c  as an OOM error,
152f0 20 77 65 20 77 6f 75 6c 64 20 6e 65 76 65 72 20   we would never 
15300 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
15310 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69  . */.    if( pLi
15320 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 26 26  stItem->pExpr &&
15330 20 41 4c 57 41 59 53 28 70 4c 69 73 74 49 74 65   ALWAYS(pListIte
15340 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29  m->pExpr->pColl)
15350 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   ){.      int nC
15360 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  oll;.      zColl
15370 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45   = pListItem->pE
15380 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  xpr->pColl->zNam
15390 65 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d  e;.      nColl =
153a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
153b0 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20  (zColl) + 1;.   
153c0 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
153d0 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  a>=nColl );.    
153e0 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
153f0 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a   zColl, nColl);.
15400 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45        zColl = zE
15410 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74  xtra;.      zExt
15420 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra += nColl;.   
15430 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f     nExtra -= nCo
15440 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
15450 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61       zColl = pTa
15460 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
15470 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f  ;.      if( !zCo
15480 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  ll ){.        zC
15490 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
154a0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  oll->zName;.    
154b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
154c0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
154d0 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61   && !sqlite3Loca
154e0 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
154f0 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
15500 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
15510 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
15520 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
15530 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
15540 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
15550 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
15560 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
15570 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
15580 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
15590 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65  rder[i] = (u8)re
155a0 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
155b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
155c0 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
155d0 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  dex);..  if( pTa
155e0 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
155f0 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
15600 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
15610 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
15620 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
15630 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
15640 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
15650 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
15660 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
15670 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
15680 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
15690 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
156a0 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
156b0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
156c0 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
156d0 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
156e0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
156f0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
15700 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
15710 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
15720 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
15730 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
15740 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
15750 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
15760 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
15770 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
15780 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
15790 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
157a0 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
157b0 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
157c0 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
157d0 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
157e0 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
157f0 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
15800 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
15810 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
15820 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
15830 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77      **.    ** Tw
15840 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  o UNIQUE or PRIM
15850 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
15860 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  nts are consider
15870 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  ed equivalent.  
15880 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73    ** (and thus s
15890 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73  uppressing the s
158a0 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20  econd one) even 
158b0 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66  if they have dif
158c0 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f  ferent.    ** so
158d0 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a  rt orders..    *
158e0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
158f0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
15900 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
15910 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f  ces or if the co
15920 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20  lumns of.    ** 
15930 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  the constraint o
15940 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e  ccur in differen
15950 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74  t orders, then t
15960 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  he constraints a
15970 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  re.    ** consid
15980 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e  ered distinct an
15990 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e  d both result in
159a0 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
159b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e  s..    */.    In
159c0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
159d0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
159e0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
159f0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
15a00 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
15a10 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
15a20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
15a30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15a40 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65  ( pIdx->autoInde
15a50 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  x );.      asser
15a60 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  t( pIndex->onErr
15a70 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a  or!=OE_None );..
15a80 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
15a90 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d  nColumn!=pIndex-
15aa0 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >nColumn ) conti
15ab0 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
15ac0 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; k<pIdx->nCol
15ad0 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  umn; k++){.     
15ae0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15af0 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  1;.        const
15b00 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20   char *z2;.     
15b10 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
15b20 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
15b30 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
15b40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a  break;.        z
15b50 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
15b60 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  [k];.        z2 
15b70 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
15b80 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
15b90 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74   z1!=z2 && sqlit
15ba0 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
15bb0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
15bc0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
15bd0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
15be0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
15bf0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
15c00 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
15c10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
15c20 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
15c30 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
15c40 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
15c50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
15c60 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
15c70 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
15c80 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
15c90 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
15ca0 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
15cb0 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
15cc0 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
15cd0 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
15ce0 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
15cf0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
15d00 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
15d10 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
15d20 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
15d30 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
15d40 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
15d50 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
15d60 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
15d70 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
15d80 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
15d90 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
15da0 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64  iour for the ind
15db0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
15dc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
15dd0 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
15de0 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
15df0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
15e00 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
15e10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15e20 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15e30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
15e40 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
15e50 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
15e60 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
15e70 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
15e80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
15e90 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
15ea0 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
15eb0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
15ec0 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
15ed0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
15ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15ef0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15f00 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15f10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15f20 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
15f30 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
15f40 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
15f50 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
15f60 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
15f70 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
15f80 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  res. .  */.  if(
15f90 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
15fa0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
15fb0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
15fc0 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65  ashInsert(&pInde
15fd0 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  x->pSchema->idxH
15fe0 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
16010 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
16020 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20  Index->zName),. 
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 29           pIndex)
16050 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
16060 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
16070 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
16080 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
16090 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 64  ailed */.      d
160a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
160b0 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
160c0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
160d0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
160e0 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
160f0 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
16100 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
16110 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
16120 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
16130 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
16140 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
16150 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
16160 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65  sy is 0 then cre
16170 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ate the index on
16180 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a   disk.  This.  *
16190 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69  * involves writi
161a0 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  ng the index int
161b0 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  o the master tab
161c0 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69  le and filling i
161d0 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
161e0 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
161f0 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  t table contents
16200 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
16210 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
16220 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72   0 when the user
16230 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20   first enters a 
16240 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20  CREATE INDEX .  
16250 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d  ** command.  db-
16260 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
16270 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
16280 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20  is opened and . 
16290 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58   ** CREATE INDEX
162a0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
162b0 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20  read out of the 
162c0 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49  master table.  I
162d0 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65  n.  ** the latte
162e0 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78  r case the index
162f0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
16300 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69  on disk, which i
16310 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f  s why.  ** we do
16320 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72  n't want to recr
16330 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20  eate it..  **.  
16340 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
16350 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
16360 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
16370 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20  ed as a primary 
16380 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  key.  ** or UNIQ
16390 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66  UE constraint of
163a0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
163b0 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
163c0 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
163d0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
163e0 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
163f0 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
16400 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
16410 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
16420 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
16430 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 20  d..  */.  else{ 
16440 2f 2a 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  /* if( db->init.
16450 62 75 73 79 3d 3d 30 20 29 20 2a 2f 0a 20 20 20  busy==0 ) */.   
16460 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
16470 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
16480 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
16490 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76  se->nMem;..    v
164a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
164b0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
164c0 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
164d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
164e0 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  ;...    /* Creat
164f0 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
16500 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  or the index.   
16510 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
16520 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
16530 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
16540 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
16550 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16560 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62  CreateIndex, iDb
16570 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  , iMem);..    /*
16580 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
16590 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
165a0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
165b0 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
165c0 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
165d0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20  riable.    */.  
165e0 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
165f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
16600 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f  nd!=0 );.      /
16610 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  * A named index 
16620 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74  with an explicit
16630 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
16640 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
16650 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
16660 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45  MPrintf(db, "CRE
16670 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
16680 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ",.        onErr
16690 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22  or==OE_None ? ""
166a0 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20   : " UNIQUE",.  
166b0 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20        pEnd->z - 
166c0 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20  pName->z + 1,.  
166d0 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b        pName->z);
166e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
166f0 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
16700 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
16710 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
16720 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
16730 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
16740 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
16750 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
16760 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
16770 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16780 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
16790 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
167a0 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
167b0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
167c0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
167d0 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
167e0 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
167f0 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
16800 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20  ,%Q,#%d,%Q);",. 
16810 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
16820 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
16830 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
16840 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
16850 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61  ame,.        pTa
16860 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
16870 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20    iMem,.        
16880 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  zStmt.    );.   
16890 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
168a0 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20  b, zStmt);..    
168b0 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65  /* Fill the inde
168c0 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20  x with data and 
168d0 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65  reparse the sche
168e0 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45  ma. Code an OP_E
168f0 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20  xpire.    ** to 
16900 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
16910 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
16920 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ements..    */. 
16930 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
16940 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16950 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
16960 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d  se, pIndex, iMem
16970 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16980 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
16990 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
169a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
169b0 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p4(v, OP_ParseSc
169c0 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c  hema, iDb, 0, 0,
169d0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
169e0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
169f0 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78  me='%q'", pIndex
16a00 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e  ->zName), P4_DYN
16a10 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  AMIC);.      sql
16a20 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16a30 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b  , OP_Expire, 0);
16a40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16a50 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
16a60 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
16a70 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
16a80 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
16a90 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
16aa0 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
16ab0 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
16ac0 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
16ad0 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
16ae0 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
16af0 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
16b00 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69  correct constrai
16b10 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72  nt check.  ** pr
16b20 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c  ocessing (in sql
16b30 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
16b40 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20  traintChecks()) 
16b50 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  as part of.  ** 
16b60 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52  UPDATE and INSER
16b70 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a  T statements.  .
16b80 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
16b90 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
16ba0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
16bb0 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
16bc0 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
16bd0 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
16be0 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
16bf0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
16c00 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
16c10 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
16c20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
16c30 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
16c40 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
16c50 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
16c60 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
16c70 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
16c80 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
16c90 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
16ca0 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
16cb0 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
16cc0 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
16cd0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
16ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
16cf0 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
16d00 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
16d10 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
16d20 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
16d30 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78     pRet = pIndex
16d40 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  ;.    pIndex = 0
16d50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
16d60 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
16d70 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
16d80 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
16d90 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
16da0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 64 65  lite3_free(pInde
16db0 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20  x->zColAff);.   
16dc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16dd0 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
16de0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
16df0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
16e00 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
16e10 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
16e20 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  TblName);.  sqli
16e30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
16e40 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
16e50 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  Ret;.}../*.** Fi
16e60 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52  ll the Index.aiR
16e70 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69  owEst[] array wi
16e80 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72  th default infor
16e90 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61  mation - informa
16ea0 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73  tion.** to be us
16eb0 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20  ed when we have 
16ec0 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c  not run the ANAL
16ed0 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
16ee0 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69  ** aiRowEst[0] i
16ef0 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e  s suppose to con
16f00 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
16f10 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
16f20 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e  he index..** Sin
16f30 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  ce we do not kno
16f40 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69  w, guess 1 milli
16f50 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d  on.  aiRowEst[1]
16f60 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
16f70 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
16f80 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
16f90 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
16fa0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
16fb0 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
16fc0 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
16fd0 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f  the index.  aiRo
16fe0 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73  wEst[2] is an es
16ff0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
17000 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
17010 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
17020 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
17030 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  iation of the fi
17040 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  rst 2 columns.**
17050 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
17060 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
17070 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  t must always be
17080 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
17090 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
170a0 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77  RowEst[N]<=aiRow
170b0 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20  Est[N-1].**     
170c0 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
170d0 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74  ]>=1.**.** Apart
170e0 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68   from that, we h
170f0 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f  ave little to go
17100 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75   on besides intu
17110 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68  ition as to.** h
17120 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68  ow aiRowEst[] sh
17130 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69  ould be initiali
17140 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  zed.  The number
17150 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65  s generated here
17160 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e  .** are based on
17170 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20   typical values 
17180 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20  found in actual 
17190 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  indices..*/.void
171a0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
171b0 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64  owEst(Index *pId
171c0 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a  x){.  unsigned *
171d0 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45  a = pIdx->aiRowE
171e0 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  st;.  int i;.  a
171f0 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20  ssert( a!=0 );. 
17200 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b   a[0] = 1000000;
17210 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e 6e  .  for(i=pIdx->n
17220 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69 2d  Column; i>=5; i-
17230 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 35  -){.    a[i] = 5
17240 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69  ;.  }.  while( i
17250 3e 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d 20  >=1 ){.    a[i] 
17260 3d 20 31 31 20 2d 20 69 3b 0a 20 20 20 20 69 2d  = 11 - i;.    i-
17270 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  -;.  }.  if( pId
17280 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
17290 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64  one ){.    a[pId
172a0 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b  x->nColumn] = 1;
172b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
172c0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
172d0 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
172e0 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
172f0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
17300 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
17310 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
17320 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
17330 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
17340 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
17350 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
17360 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64  ifExists){.  Ind
17370 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
17380 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
17390 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
173a0 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
173b0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
173c0 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a  >nErr==0 );   /*
173d0 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
173e0 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
173f0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
17400 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
17410 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
17420 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
17430 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
17440 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
17450 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
17460 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
17470 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
17480 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
17490 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
174a0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
174b0 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
174c0 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
174d0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
174e0 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
174f0 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
17500 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
17510 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17520 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
17530 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
17540 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  0);.    }.    pP
17550 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
17560 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
17570 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
17580 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
17590 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
175a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
175b0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
175c0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
175d0 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
175e0 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
175f0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
17600 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
17610 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
17620 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
17630 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
17640 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
17650 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
17660 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ema);.#ifndef SQ
17670 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
17680 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
17690 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
176a0 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
176b0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
176c0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
176d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
176e0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
176f0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
17700 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
17710 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
17720 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
17730 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
17740 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
17750 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
17760 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
17770 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
17780 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
17790 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
177a0 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
177b0 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
177c0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
177d0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
177e0 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
177f0 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
17800 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
17810 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
17820 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
17830 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17840 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17850 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
17860 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
17870 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
17880 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
17890 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
178a0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
178b0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
178c0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
178d0 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
178e0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
178f0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
17900 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
17910 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
17920 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
17930 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
17940 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
17950 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  .       pIndex->
17960 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
17970 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
17980 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74  Table(db, "sqlit
17990 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44  e_stat1", db->aD
179a0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b  b[iDb].zName) ){
179b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
179c0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
179d0 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
179e0 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  E FROM %Q.sqlite
179f0 5f 73 74 61 74 31 20 57 48 45 52 45 20 69 64 78  _stat1 WHERE idx
17a00 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 64 62  =%Q",.        db
17a10 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
17a20 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a  , pIndex->zName.
17a30 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
17a40 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
17a50 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
17a60 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
17a70 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
17a80 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
17a90 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
17aa0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17ab0 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
17ac0 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
17ad0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
17ae0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
17af0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
17b00 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
17b10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72  );.}../*.** pArr
17b20 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
17b30 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f  to an array of o
17b40 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f 62  bjects.  Each ob
17b50 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61  ject in the.** a
17b60 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20  rray is szEntry 
17b70 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20  bytes in size.  
17b80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  This routine all
17b90 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  ocates a new.** 
17ba0 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65 6e  object on the en
17bb0 64 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a  d of the array..
17bc0 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69  **.** *pnEntry i
17bd0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17be0 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79 20  entries already 
17bf0 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f  in use.  *pnAllo
17c00 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65 76  c is.** the prev
17c10 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
17c20 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
17c30 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73  ay.  initSize is
17c40 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74 65   the.** suggeste
17c50 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79 20  d initial array 
17c60 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  size allocation.
17c70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
17c80 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
17c90 79 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  y is returned in
17ca0 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pIdx..**.** Th
17cb0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
17cc0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
17cd0 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62 6a  the array of obj
17ce0 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  ects.  This.** m
17cf0 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65  ight be the same
17d00 20 61 73 20 74 68 65 20 70 41 72 72 61 79 20 70   as the pArray p
17d10 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20 6d  arameter or it m
17d20 69 67 68 74 20 62 65 20 61 20 64 69 66 66 65 72  ight be a differ
17d30 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  ent.** pointer i
17d40 66 20 74 68 65 20 61 72 72 61 79 20 77 61 73 20  f the array was 
17d50 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64  resized..*/.void
17d60 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
17d70 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
17d80 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
17d90 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
17da0 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
17db0 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
17dc0 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
17dd0 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
17de0 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
17df0 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
17e00 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
17e10 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
17e20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
17e30 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69  ray */.  int ini
17e40 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75  tSize,     /* Su
17e50 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20  ggested initial 
17e60 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
17e70 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
17e80 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
17e90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
17ea0 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
17eb0 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
17ec0 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43  nAlloc,     /* C
17ed0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
17ee0 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  he allocation, i
17ef0 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  n elements */.  
17f00 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
17f10 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
17f20 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
17f30 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
17f40 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a  char *z;.  if( *
17f50 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c  pnEntry >= *pnAl
17f60 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  loc ){.    void 
17f70 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
17f80 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53  ewSize;.    newS
17f90 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29  ize = (*pnAlloc)
17fa0 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20  *2 + initSize;. 
17fb0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
17fc0 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
17fd0 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73  Array, newSize*s
17fe0 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
17ff0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
18000 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
18010 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
18020 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e  y;.    }.    *pn
18030 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
18040 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
18050 70 4e 65 77 29 2f 73 7a 45 6e 74 72 79 3b 0a 20  pNew)/szEntry;. 
18060 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77     pArray = pNew
18070 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
18080 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d  r*)pArray;.  mem
18090 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20  set(&z[*pnEntry 
180a0 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73  * szEntry], 0, s
180b0 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78  zEntry);.  *pIdx
180c0 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b   = *pnEntry;.  +
180d0 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
180e0 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
180f0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
18100 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
18110 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
18120 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
18130 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
18140 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
18150 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
18160 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
18170 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
18180 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
18190 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c  IdListAppend(sql
181a0 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
181b0 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
181c0 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69  pToken){.  int i
181d0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
181e0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
181f0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
18200 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49  ero(db, sizeof(I
18210 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
18220 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
18230 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
18240 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
18250 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
18260 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
18270 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20  ate(.      db,. 
18280 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20       pList->a,. 
18290 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73       sizeof(pLis
182a0 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20  t->a[0]),.      
182b0 35 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  5,.      &pList-
182c0 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c 69  >nId,.      &pLi
182d0 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  st->nAlloc,.    
182e0 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
182f0 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
18300 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
18310 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
18320 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
18330 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
18340 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
18350 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
18360 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
18370 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
18380 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
18390 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
183a0 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
183b0 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
183c0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
183d0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
183e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
183f0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
18400 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
18410 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
18420 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
18430 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
18440 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
18450 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
18460 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
18470 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
18480 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
18490 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
184a0 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
184b0 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
184c0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
184d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
184e0 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
184f0 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
18500 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
18510 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
18520 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
18530 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
18540 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
18550 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
18560 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
18570 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
18580 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
18590 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
185a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  .}../*.** Expand
185b0 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
185c0 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
185d0 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
185e0 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
185f0 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
18600 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
18610 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
18620 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
18630 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
18640 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
18650 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
18660 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
18670 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
18680 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
18690 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
186a0 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
186b0 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
186c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
186d0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
186e0 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
186f0 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
18700 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
18710 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
18720 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
18730 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
18740 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
18750 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
18760 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
18770 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
18780 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
18790 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
187a0 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
187b0 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
187c0 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
187d0 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
187e0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
187f0 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
18800 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
18810 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
18820 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
18830 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c  n fails the SrcL
18840 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ist is unchanged
18850 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61  .  The.** db->ma
18860 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
18870 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
18880 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rue..*/.SrcList 
18890 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
188a0 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65  nlarge(.  sqlite
188b0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
188c0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
188d0 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
188e0 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20   OOM errors */. 
188f0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
18900 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
18910 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
18920 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
18930 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
18940 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
18950 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
18960 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
18970 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
18980 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
18990 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
189a0 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
189b0 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
189c0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
189d0 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
189e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
189f0 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
18a00 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
18a10 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
18a20 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18a30 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53  iStart<=pSrc->nS
18a40 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rc );..  /* Allo
18a50 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  cate additional 
18a60 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20  space if needed 
18a70 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
18a80 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
18a90 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
18aa0 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
18ab0 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
18ac0 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
18ad0 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
18ae0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
18af0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
18b00 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
18b10 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
18b20 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
18b30 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
18b40 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
18b50 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
18b60 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
18b70 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
18b80 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
18b90 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
18ba0 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
18bb0 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
18bc0 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
18bd0 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
18be0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
18bf0 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
18c00 6e 41 6c 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47  nAlloc = (u16)nG
18c10 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  ot;.  }..  /* Mo
18c20 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74  ve existing slot
18c30 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65  s that come afte
18c40 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  r the newly inse
18c50 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20  rted slots.  ** 
18c60 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a  out of the way *
18c70 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e  /.  for(i=pSrc->
18c80 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72  nSrc-1; i>=iStar
18c90 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72  t; i--){.    pSr
18ca0 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d  c->a[i+nExtra] =
18cb0 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d   pSrc->a[i];.  }
18cc0 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d  .  pSrc->nSrc +=
18cd0 20 28 69 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20   (i16)nExtra;.. 
18ce0 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77   /* Zero the new
18cf0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  ly allocated slo
18d00 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ts */.  memset(&
18d10 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c  pSrc->a[iStart],
18d20 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d   0, sizeof(pSrc-
18d30 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a  >a[0])*nExtra);.
18d40 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20    for(i=iStart; 
18d50 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b  i<iStart+nExtra;
18d60 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d   i++){.    pSrc-
18d70 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
18d80 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  -1;.  }..  /* Re
18d90 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
18da0 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53  o the enlarged S
18db0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75  rcList */.  retu
18dc0 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pSrc;.}.../*.
18dd0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
18de0 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
18df0 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
18e00 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
18e10 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
18e20 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
18e30 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
18e40 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
18e50 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e  n if pTable is N
18e60 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63  ULL..**.** A Src
18e70 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
18e80 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
18e90 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72  re is an OOM err
18ea0 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  or.  The returne
18eb0 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67  d.** SrcList mig
18ec0 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
18ed0 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  s the SrcList th
18ee0 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20  at was input or 
18ef0 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  it might be.** a
18f00 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e   new one.  If an
18f10 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20   OOM error does 
18f20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
18f30 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20   prior value of 
18f40 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73  pList.** that is
18f50 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
18f60 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61  outine is automa
18f70 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  tically freed..*
18f80 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
18f90 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
18fa0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
18fb0 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
18fc0 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
18fd0 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
18fe0 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
18ff0 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
19000 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
19010 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
19020 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
19030 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
19040 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19050 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
19060 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
19070 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
19080 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
19090 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
190a0 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
190b0 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
190c0 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
190d0 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
190e0 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
190f0 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
19100 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
19110 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
19120 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
19130 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
19140 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
19150 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
19160 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
19170 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
19180 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
19190 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
191a0 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,0);.**.** T
191b0 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
191c0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
191d0 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
191e0 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
191f0 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
19200 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
19210 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
19220 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29  tAppend(D,A,B,C)
19230 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
19240 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
19250 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
19260 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66  tabase name.  If
19270 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a   C is defined.**
19280 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20   then so is B.  
19290 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
192a0 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  we never have a 
192b0 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a  case where:.**.*
192c0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
192d0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
192e0 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42  ,A,0,C);.**.** B
192f0 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70  oth pTable and p
19300 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73  Database are ass
19310 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65  umed to be quote
19320 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71  d.  They are deq
19330 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  uoted.** before 
19340 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
19350 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53  he SrcList..*/.S
19360 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
19370 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  rcListAppend(.  
19380 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
19390 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
193a0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
193b0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
193c0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  /.  SrcList *pLi
193d0 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  st,     /* Appen
193e0 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73  d to this SrcLis
193f0 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20  t. NULL creates 
19400 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f  a new SrcList */
19410 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
19420 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ,      /* Table 
19430 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54  to append */.  T
19440 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20  oken *pDatabase 
19450 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
19460 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  f the table */.)
19470 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
19480 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
19490 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62    assert( pDatab
194a0 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65  ase==0 || pTable
194b0 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  !=0 );  /* Canno
194c0 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74  t have C without
194d0 20 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73   B */.  if( pLis
194e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
194f0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
19500 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
19510 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
19520 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
19530 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
19540 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
19550 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  1;.  }.  pList =
19560 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
19570 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74  nlarge(db, pList
19580 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63  , 1, pList->nSrc
19590 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
195a0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
195b0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
195c0 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
195d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
195e0 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
195f0 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
19600 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44  Src-1];.  if( pD
19610 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
19620 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
19630 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
19640 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
19650 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  base ){.    Toke
19660 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
19670 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
19680 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
19690 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
196a0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a  ;.  }.  pItem->z
196b0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
196c0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
196d0 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d  pTable);.  pItem
196e0 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
196f0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
19700 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65  en(db, pDatabase
19710 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
19720 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
19730 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e  gn VdbeCursor in
19740 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61  dex numbers to a
19750 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
19760 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
19770 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
19780 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
19790 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
197a0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
197b0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
197c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
197d0 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74  ;.  assert(pList
197e0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
197f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
19800 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
19810 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
19820 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
19830 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
19840 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
19850 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
19860 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
19870 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72       pItem->iCur
19880 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
19890 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
198a0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
198b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
198c0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
198d0 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
198e0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
198f0 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
19900 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
19910 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
19920 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
19930 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
19940 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
19950 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
19960 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
19970 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  b, SrcList *pLis
19980 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
19990 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
199a0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
199b0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
199c0 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
199d0 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
199e0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
199f0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
19a00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19a10 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  b, pItem->zDatab
19a20 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
19a30 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
19a40 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
19a50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19a60 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
19a70 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
19a80 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49  ee(db, pItem->zI
19a90 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
19aa0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 49  e3DeleteTable(pI
19ab0 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
19ac0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
19ad0 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
19ae0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
19af0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
19b00 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  b, pItem->pOn);.
19b10 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
19b20 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
19b30 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
19b40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19b50 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
19b60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19b70 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
19b80 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64  he parser to add
19b90 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
19ba0 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67  he.** end of a g
19bb0 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75  rowing FROM clau
19bc0 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72  se.  The "p" par
19bd0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61  ameter is the pa
19be0 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f  rt of.** the FRO
19bf0 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61  M clause that ha
19c00 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
19c10 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22  onstructed.  "p"
19c20 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74   is NULL.** if t
19c30 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
19c40 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
19c50 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c  M clause.  pTabl
19c60 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a  e and pDatabase.
19c70 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20  ** are the name 
19c80 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
19c90 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
19ca0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
19cb0 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74  se term..** pDat
19cc0 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66  abase is NULL if
19cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
19ce0 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  me qualifier is 
19cf0 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a  missing - the.**
19d00 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66   usual case.  If
19d10 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20   the term has a 
19d20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
19d30 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
19d40 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
19d50 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
19d60 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
19d70 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
19d80 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
19d90 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
19da0 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
19db0 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
19dc0 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
19dd0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
19de0 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
19df0 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
19e00 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
19e10 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
19e20 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
19e30 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
19e40 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
19e50 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
19e60 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
19e70 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
19e80 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
19e90 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
19ea0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
19eb0 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
19ec0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
19ed0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
19ee0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
19ef0 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
19f00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
19f10 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
19f20 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
19f30 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
19f40 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
19f50 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
19f60 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
19f70 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
19f80 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
19f90 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
19fa0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
19fb0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
19fc0 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
19fd0 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
19fe0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
19ff0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
1a000 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
1a010 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
1a020 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
1a030 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
1a040 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
1a050 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
1a060 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a080 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
1a090 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
1a0a0 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
1a0b0 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
1a0c0 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
1a0d0 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
1a0e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1a0f0 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
1a100 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1a110 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28  b;.  if( !p && (
1a120 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29  pOn || pUsing) )
1a130 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1a140 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1a150 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20   JOIN clause is 
1a160 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1a170 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e  %s", .      (pOn
1a180 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47   ? "ON" : "USING
1a190 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f  ").    );.    go
1a1a0 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1a1b0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rror;.  }.  p = 
1a1c0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1a1d0 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62  pend(db, p, pTab
1a1e0 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  le, pDatabase);.
1a1f0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
1a200 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20  VER(p->nSrc==0) 
1a210 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
1a220 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1a230 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d   }.  pItem = &p-
1a240 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1a250 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21   assert( pAlias!
1a260 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69  =0 );.  if( pAli
1a270 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
1a280 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
1a290 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1a2a0 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
1a2b0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
1a2c0 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
1a2d0 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
1a2e0 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
1a2f0 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
1a300 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70   return p;.. app
1a310 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a  end_from_error:.
1a320 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
1a330 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1a340 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
1a350 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1a360 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67  elete(db, pUsing
1a370 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1a380 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1a390 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72  bquery);.  retur
1a3a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
1a3b0 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
1a3c0 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
1a3d0 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
1a3e0 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
1a3f0 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
1a400 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1a410 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1a420 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
1a430 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1a440 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
1a450 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1a460 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
1a470 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
1a480 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64  assert( pIndexed
1a490 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  By!=0 );.  if( p
1a4a0 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53   && ALWAYS(p->nS
1a4b0 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72  rc>0) ){.    str
1a4c0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1a4d0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1a4e0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
1a4f0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e  assert( pItem->n
1a500 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20  otIndexed==0 && 
1a510 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30  pItem->zIndex==0
1a520 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
1a530 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20  exedBy->n==1 && 
1a540 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29  !pIndexedBy->z )
1a550 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f  {.      /* A "NO
1a560 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
1a570 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20  e was supplied. 
1a580 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20  See parse.y .   
1a590 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
1a5a0 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f  "indexed_opt" fo
1a5b0 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
1a5c0 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e      pItem->notIn
1a5d0 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1a5e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1a5f0 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
1a600 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1a610 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e  (pParse->db, pIn
1a620 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
1a630 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1a640 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
1a650 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
1a660 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
1a670 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
1a680 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
1a690 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
1a6a0 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
1a6b0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1a6c0 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
1a6d0 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
1a6e0 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
1a6f0 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
1a700 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
1a710 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
1a720 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
1a730 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
1a740 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
1a750 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
1a760 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
1a770 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
1a780 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1a790 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
1a7a0 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
1a7b0 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
1a7c0 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
1a7d0 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
1a7e0 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
1a7f0 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
1a800 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
1a810 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
1a820 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
1a830 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
1a840 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
1a850 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
1a860 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
1a870 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
1a880 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
1a890 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
1a8a0 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
1a8b0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  t *p){.  if( p &
1a8c0 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e  & p->a ){.    in
1a8d0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
1a8e0 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
1a8f0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
1a900 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  i].jointype = p-
1a910 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  >a[i-1].jointype
1a920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
1a930 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30  [0].jointype = 0
1a940 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
1a950 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
1a960 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1a970 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
1a980 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1a990 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
1a9a0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
1a9b0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
1a9c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1a9d0 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  e!=0 );.  db = p
1a9e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
1a9f0 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a  ert( db!=0 );./*
1aa00 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d    if( db->aDb[0]
1aa10 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
1aa20 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  ; */.  if( sqlit
1aa30 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1aa40 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1aa50 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
1aa60 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
1aa70 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
1aa80 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1aa90 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
1aaa0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1aab0 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
1aac0 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
1aad0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1aae0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1aaf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ab00 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1ab10 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
1ab20 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20  USIVE)+1);.     
1ab30 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
1ab40 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20  Btree(v, i);.   
1ab50 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1ab60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ab70 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
1ab80 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0);.}../*.** Com
1ab90 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
1aba0 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
1abb0 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
1abc0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1abd0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1abe0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
1abf0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1ac00 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  0 );.  db = pPar
1ac10 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
1ac20 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69  ( db!=0 );./*  i
1ac30 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  f( db->aDb[0].pB
1ac40 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a  t==0 ) return; *
1ac50 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
1ac60 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1ac70 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
1ac80 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ION, "COMMIT", 0
1ac90 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1aca0 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1acb0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1acc0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1acd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ace0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1acf0 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a  oCommit, 1, 0);.
1ad00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c    }.}../*.** Rol
1ad10 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1ad20 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1ad30 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
1ad40 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
1ad50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
1ad60 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1ad70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1ad80 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
1ad90 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
1ada0 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f  sert( db!=0 );./
1adb0 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30  *  if( db->aDb[0
1adc0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
1add0 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  n; */.  if( sqli
1ade0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1adf0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1ae00 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
1ae10 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  CK", 0, 0) ){.  
1ae20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1ae30 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1ae40 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1ae50 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1ae60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ae70 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
1ae80 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
1ae90 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1aea0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1aeb0 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
1aec0 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
1aed0 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
1aee0 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
1aef0 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
1af00 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
1af10 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
1af20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1af30 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
1af40 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
1af50 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1af60 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1af70 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
1af80 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
1af90 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1afa0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1afb0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
1afc0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1afd0 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
1afe0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
1aff0 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
1b000 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
1b010 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
1b020 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
1b030 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
1b040 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1b050 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
1b060 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
1b070 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
1b080 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
1b090 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1b0a0 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
1b0b0 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
1b0c0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1b0d0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1b0e0 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
1b0f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1b100 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b110 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
1b120 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
1b130 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
1b140 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
1b150 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1b160 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
1b170 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
1b180 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
1b190 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
1b1a0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
1b1b0 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
1b1c0 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
1b1d0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
1b1e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b1f0 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1b200 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1b210 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1b220 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1b230 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
1b240 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
1b250 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
1b260 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
1b270 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
1b280 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
1b290 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
1b2a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1b2b0 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
1b2c0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
1b2d0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
1b2e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1b2f0 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
1b300 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1b310 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1b320 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1b330 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
1b340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1b350 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
1b360 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46  0, 0, SQLITE_DEF
1b370 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c  AULT_CACHE_SIZE,
1b380 20 66 6c 61 67 73 2c 20 26 70 42 74 29 3b 0a 20   flags, &pBt);. 
1b390 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b3a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1b3b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b3c0 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
1b3d0 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
1b3e0 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
1b3f0 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
1b400 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
1b410 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
1b420 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
1b430 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1b440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
1b450 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74  aDb[1].pBt = pBt
1b460 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
1b470 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
1b480 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
1b490 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65  TE_NOMEM==sqlite
1b4a0 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
1b4b0 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50  e(pBt, db->nextP
1b4c0 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20  agesize, -1, 0) 
1b4d0 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
1b4e0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
1b4f0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1b500 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b510 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
1b520 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
1b530 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66   that will verif
1b540 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
1b550 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a  kie and start.**
1b560 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1b570 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65  ion for all name
1b580 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  d database files
1b590 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d  ..**.** It is im
1b5a0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c  portant that all
1b5b0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20   schema cookies 
1b5c0 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20  be verified and 
1b5d0 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e  all.** read tran
1b5e0 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72  sactions be star
1b5f0 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68  ted before anyth
1b600 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73  ing else happens
1b610 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20   in.** the VDBE 
1b620 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68  program.  But th
1b630 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
1b640 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d  e called after m
1b650 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64  uch other.** cod
1b660 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72  e has been gener
1b670 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69  ated.  So here i
1b680 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a  s what we do:.**
1b690 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
1b6a0 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
1b6b0 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f  is called, we co
1b6c0 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68  de an OP_Goto th
1b6d0 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20  at.** will jump 
1b6e0 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  to a subroutine 
1b6f0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1b700 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e  e program.  Then
1b710 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76   we.** record ev
1b720 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ery database tha
1b730 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65  t needs its sche
1b740 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74  ma verified in t
1b750 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f  he.** pParse->co
1b760 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20  okieMask field. 
1b770 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c   Later, after al
1b780 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73  l other code has
1b790 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74   been.** generat
1b7a0 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ed, the subrouti
1b7b0 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65  ne that does the
1b7c0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61   cookie verifica
1b7d0 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61  tions and.** sta
1b7e0 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  rts the transact
1b7f0 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64  ions will be cod
1b800 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f  ed and the OP_Go
1b810 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77  to P2 value.** w
1b820 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70  ill be made to p
1b830 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62  oint to that sub
1b840 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65  routine.  The ge
1b850 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  neration of the.
1b860 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  ** cookie verifi
1b870 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e  cation subroutin
1b880 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69  e code happens i
1b890 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  n sqlite3FinishC
1b8a0 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  oding()..**.** I
1b8b0 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64  f iDb<0 then cod
1b8c0 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e  e the OP_Goto on
1b8d0 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66  ly - don't set f
1b8e0 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74 68  lag to verify th
1b8f0 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61  e.** schema on a
1b900 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20 54  ny databases.  T
1b910 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
1b920 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20  to position the 
1b930 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79  OP_Goto.** early
1b940 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65   in the code, be
1b950 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20  fore we know if 
1b960 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61 62  any database tab
1b970 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  les will be used
1b980 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b990 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1b9a0 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
1b9b0 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72   int iDb){.  Par
1b9c0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1b9d0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1b9e0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20  evel(pParse);.. 
1b9f0 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e   if( pToplevel->
1ba00 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b  cookieGoto==0 ){
1ba10 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
1ba20 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 54  qlite3GetVdbe(pT
1ba30 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66  oplevel);.    if
1ba40 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
1ba50 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
1ba60 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20  appens if there 
1ba70 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f  was a prior erro
1ba80 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70 6c 65 76  r */.    pToplev
1ba90 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  el->cookieGoto =
1baa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bab0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1bac0 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66  , 0)+1;.  }.  if
1bad0 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20  ( iDb>=0 ){.    
1bae0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54  sqlite3 *db = pT
1baf0 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 20 20 20  oplevel->db;.   
1bb00 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 20 20   int mask;..    
1bb10 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
1bb20 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nDb );.    asser
1bb30 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
1bb40 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31  pBt!=0 || iDb==1
1bb50 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1bb60 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41  iDb<SQLITE_MAX_A
1bb70 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20  TTACHED+2 );.   
1bb80 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a   mask = 1<<iDb;.
1bb90 20 20 20 20 69 66 28 20 28 70 54 6f 70 6c 65 76      if( (pToplev
1bba0 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26  el->cookieMask &
1bbb0 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
1bbc0 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f     pToplevel->co
1bbd0 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  okieMask |= mask
1bbe0 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
1bbf0 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  l->cookieValue[i
1bc00 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  Db] = db->aDb[iD
1bc10 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
1bc20 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20  ma_cookie;.     
1bc30 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1bc40 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
1bc50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70         sqlite3Op
1bc60 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
1bc70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 20  Toplevel);.     
1bc80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1bc90 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
1bca0 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
1bcb0 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
1bcc0 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
1bcd0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1bce0 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
1bcf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1bd00 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
1bd10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
1bd20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
1bd30 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
1bd40 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
1bd50 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
1bd60 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
1bd70 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
1bd80 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
1bd90 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
1bda0 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
1bdb0 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
1bdc0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
1bdd0 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
1bde0 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
1bdf0 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
1be00 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
1be10 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
1be20 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
1be30 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
1be40 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
1be50 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1be60 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
1be70 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
1be80 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
1be90 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
1bea0 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
1beb0 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
1bec0 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
1bed0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
1bee0 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
1bef0 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
1bf00 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
1bf10 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
1bf20 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
1bf30 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  be set..*/.void 
1bf40 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1bf50 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
1bf60 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
1bf70 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20  tStatement, int 
1bf80 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  iDb){.  Parse *p
1bf90 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1bfa0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1bfb0 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
1bfc0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1bfd0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
1bfe0 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72  .  pToplevel->wr
1bff0 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44  iteMask |= 1<<iD
1c000 62 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  b;.  pToplevel->
1c010 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20  isMultiWrite |= 
1c020 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a  setStatement;.}.
1c030 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  ./*.** Indicate 
1c040 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
1c050 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  nt currently und
1c060 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1c070 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d  might write.** m
1c080 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74  ore than one ent
1c090 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c  ry (example: del
1c0a0 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68  eting one row th
1c0b0 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f  en inserting ano
1c0c0 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69  ther,.** inserti
1c0d0 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ng multiple rows
1c0e0 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20   in a table, or 
1c0f0 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20  inserting a row 
1c100 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
1c110 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f  s.).** If an abo
1c120 72 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  rt occurs after 
1c130 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72  some of these wr
1c140 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65  ites have comple
1c150 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  ted, then it wil
1c160 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72  l.** be necessar
1c170 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f  y to undo the co
1c180 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a  mpleted writes..
1c190 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
1c1a0 75 6c 74 69 57 72 69 74 65 28 50 61 72 73 65 20  ultiWrite(Parse 
1c1b0 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73  *pParse){.  Pars
1c1c0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1c1d0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1c1e0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  vel(pParse);.  p
1c1f0 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
1c200 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f  iWrite = 1;.}../
1c210 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  * .** The code g
1c220 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74  enerator calls t
1c230 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69  his routine if i
1c240 73 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  s discovers that
1c250 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62   it is.** possib
1c260 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74  le to abort a st
1c270 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f  atement prior to
1c280 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e   completion.  In
1c290 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65   order to .** pe
1c2a0 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74  rform this abort
1c2b0 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74   without corrupt
1c2c0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1c2d0 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  , we need to mak
1c2e0 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74  e.** sure that t
1c2f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
1c300 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20 73  protected by a s
1c310 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1c320 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68  tion..**.** Tech
1c330 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79  nically, we only
1c340 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74 68 65   need to set the
1c350 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69   mayAbort flag i
1c360 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69  f the.** isMulti
1c370 57 72 69 74 65 20 66 6c 61 67 20 77 61 73 20 70  Write flag was p
1c380 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20  reviously set.  
1c390 54 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20  There is a time 
1c3a0 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75  dependency.** su
1c3b0 63 68 20 74 68 61 74 20 74 68 65 20 61 62 6f 72  ch that the abor
1c3c0 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74  t must occur aft
1c3d0 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74  er the multiwrit
1c3e0 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a  e.  This makes.*
1c3f0 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74  * some statement
1c400 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20  s involving the 
1c410 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74  REPLACE conflict
1c420 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
1c430 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69  rithm.** go a li
1c440 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75  ttle faster.  Bu
1c450 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61  t taking advanta
1c460 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20  ge of this time 
1c470 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61  dependency.** ma
1c480 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66  kes it more diff
1c490 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74  icult to prove t
1c4a0 68 61 74 20 74 68 65 20 63 6f 64 65 20 69 73 20  hat the code is 
1c4b0 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20  correct (in .** 
1c4c0 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70  particular, it p
1c4d0 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
1c4e0 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63  writing an effec
1c4f0 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tive.** implemen
1c500 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  tation of sqlite
1c510 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
1c520 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76  )) and so we hav
1c530 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74  e chosen.** to t
1c540 61 6b 65 20 74 68 65 20 73 61 66 65 20 72 6f 75  ake the safe rou
1c550 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20  te and skip the 
1c560 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f  optimization..*/
1c570 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79  .void sqlite3May
1c580 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61  Abort(Parse *pPa
1c590 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
1c5a0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1c5b0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1c5c0 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
1c5d0 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d  evel->mayAbort =
1c5e0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64   1;.}../*.** Cod
1c5f0 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61  e an OP_Halt tha
1c600 74 20 63 61 75 73 65 73 20 74 68 65 20 76 64 62  t causes the vdb
1c610 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53  e to return an S
1c620 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1c630 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f  .** error. The o
1c640 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72  nError parameter
1c650 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
1c660 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68  h (if any) of th
1c670 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61  e statement.** a
1c680 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72  nd/or current tr
1c690 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1c6a0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  led back..*/.voi
1c6b0 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e  d sqlite3HaltCon
1c6c0 73 74 72 61 69 6e 74 28 50 61 72 73 65 20 2a 70  straint(Parse *p
1c6d0 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
1c6e0 6f 72 2c 20 63 68 61 72 20 2a 70 34 2c 20 69 6e  or, char *p4, in
1c6f0 74 20 70 34 74 79 70 65 29 7b 0a 20 20 56 64 62  t p4type){.  Vdb
1c700 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
1c710 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1c720 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
1c730 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71  _Abort ){.    sq
1c740 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
1c750 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  arse);.  }.  sql
1c760 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1c770 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
1c780 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f 6e  E_CONSTRAINT, on
1c790 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
1c7a0 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  type);.}../*.** 
1c7b0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1c7c0 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20  pIndex uses the 
1c7d0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1c7e0 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72  ce pColl.  Retur
1c7f0 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20  n.** true if it 
1c800 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69  does and false i
1c810 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
1c820 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1c830 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
1c840 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69  atic int collati
1c850 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
1c860 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78  ar *zColl, Index
1c870 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
1c880 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   i;.  assert( zC
1c890 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  oll!=0 );.  for(
1c8a0 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
1c8b0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1c8c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1c8d0 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
1c8e0 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
1c8f0 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   z!=0 );.    if(
1c900 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
1c910 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  mp(z, zColl) ){.
1c920 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1c930 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c940 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1c950 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
1c960 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
1c970 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65  Tab that use the
1c980 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1c990 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66  nce pColl..** If
1c9a0 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
1c9b0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
1c9c0 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f  ices of pTab..*/
1c9d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c9e0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
1c9f0 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
1ca00 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
1ca10 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
1ca20 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
1ca30 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  oll){.  Index *p
1ca40 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1ca50 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1ca60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ca70 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  pTab */..  for(p
1ca80 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
1ca90 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
1caa0 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
1cab0 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  ){.    if( zColl
1cac0 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e  ==0 || collation
1cad0 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e  Match(zColl, pIn
1cae0 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  dex) ){.      in
1caf0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
1cb00 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
1cb10 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
1cb20 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73  Schema);.      s
1cb30 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1cb40 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1cb50 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , 0, iDb);.     
1cb60 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1cb70 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1cb80 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  ex, -1);.    }. 
1cb90 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
1cba0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
1cbb0 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20   indices of all 
1cbc0 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61  tables in all da
1cbd0 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68  tabases where th
1cbe0 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65  e.** indices use
1cbf0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
1cc00 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
1cc10 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
1cc20 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c   recompute.** al
1cc30 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77  l indices everyw
1cc40 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  here..*/.#ifndef
1cc50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1cc60 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
1cc70 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
1cc80 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1cc90 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
1cca0 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
1ccd0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
1cce0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
1ccf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cd00 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
1cd10 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
1cd20 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1cd30 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
1cd40 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1cd50 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
1cd60 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
1cd70 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1cd80 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
1cd90 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
1cda0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
1cdb0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
1cdc0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1cdd0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30   */..  for(iDb=0
1cde0 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
1cdf0 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1ce00 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61  +, pDb++){.    a
1ce10 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b  ssert( pDb!=0 );
1ce20 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
1ce30 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
1ce40 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
1ce50 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
1ce60 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
1ce70 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
1ce80 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
1ce90 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e  a(k);.      rein
1cea0 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
1ceb0 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   pTab, zColl);. 
1cec0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
1ced0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
1cee0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52  e code for the R
1cef0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
1cf00 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49  **.**        REI
1cf10 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20  NDEX            
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf30 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 1.**        R
1cf40 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69  EINDEX  <collati
1cf50 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  on>             
1cf60 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
1cf70 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
1cf80 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
1cf90 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20  e>  -- 3.**     
1cfa0 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
1cfb0 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e  tabase>.?<indexn
1cfc0 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a  ame>  -- 4.**.**
1cfd0 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61   Form 1 causes a
1cfe0 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
1cff0 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
1d000 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69  ases to be rebui
1d010 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65  lt..** Form 2 re
1d020 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63  builds all indic
1d030 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
1d040 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
1d050 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74   named.** collat
1d060 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46  ing function.  F
1d070 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62  orms 3 and 4 reb
1d080 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69  uild the named i
1d090 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69  ndex or all.** i
1d0a0 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
1d0b0 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
1d0c0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
1d0d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
1d0e0 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69  EINDEX.void sqli
1d0f0 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65  te3Reindex(Parse
1d100 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
1d110 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
1d120 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53  pName2){.  CollS
1d130 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
1d140 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
1d150 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
1d160 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72  be reindexed, or
1d170 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
1d180 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
1d190 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1d1a0 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
1d1b0 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
1d1c0 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
1d1d0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1d1e0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
1d1f0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
1d200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d210 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
1d220 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
1d230 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1d240 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1d250 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1d260 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69  with pTab */.  i
1d270 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
1d280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d290 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
1d2a0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
1d2b0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1d2c0 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
1d2d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1d2e0 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
1d2f0 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20  pObjName;       
1d300 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1d310 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
1d320 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ex to be reindex
1d330 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
1d340 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1d350 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
1d360 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
1d370 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1d380 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
1d390 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
1d3a0 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
1d3b0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1d3c0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
1d3d0 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
1d3e0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
1d3f0 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
1d400 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
1d410 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ses(pParse, 0);.
1d420 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
1d430 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e  lse if( NEVER(pN
1d440 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d  ame2==0) || pNam
1d450 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
1d460 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
1d470 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d   assert( pName1-
1d480 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20  >z );.    zColl 
1d490 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1d4a0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
1d4b0 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
1d4c0 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
1d4d0 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  urn;.    pColl =
1d4e0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
1d4f0 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
1d500 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   zColl, 0);.    
1d510 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1d520 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
1d530 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
1d540 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1d550 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
1d560 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
1d570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1d580 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
1d590 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20  oll);.  }.  iDb 
1d5a0 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
1d5b0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
1d5c0 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
1d5d0 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
1d5e0 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
1d5f0 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
1d600 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f  FromToken(db, pO
1d610 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  bjName);.  if( z
1d620 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1d630 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
1d640 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62  b].zName;.  pTab
1d650 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1d660 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
1d670 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
1d680 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
1d690 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
1d6a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1d6b0 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
1d6c0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
1d6d0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
1d6e0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
1d6f0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Db);.  sqlite3Db
1d700 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69  Free(db, z);.  i
1d710 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
1d720 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1d730 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1d740 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
1d750 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1d760 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1d770 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
1d780 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
1d790 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d7a0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
1d7b0 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
1d7c0 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
1d7d0 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
1d7e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79  *.** Return a dy
1d7f0 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65  namicly allocate
1d800 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  d KeyInfo struct
1d810 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ure that can be 
1d820 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f  used.** with OP_
1d830 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f  OpenRead or OP_O
1d840 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65  penWrite to acce
1d850 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ss database inde
1d860 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
1d870 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70   successful, a p
1d880 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1d890 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  w structure is r
1d8a0 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
1d8b0 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c   case.** the cal
1d8c0 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
1d8d0 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73  le for calling s
1d8e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d8f0 20 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e   ) on the return
1d900 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20  ed .** pointer. 
1d910 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1d920 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rs (out of memor
1d930 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c  y or missing col
1d940 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65  lation .** seque
1d950 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65  nce), NULL is re
1d960 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1d970 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20 75  tate of pParse u
1d980 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
1d990 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a  t.** the error..
1d9a0 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
1d9b0 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
1d9c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
1d9d0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
1d9e0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
1d9f0 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
1da00 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d  ;.  int nBytes =
1da10 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
1da20 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65   + (nCol-1)*size
1da30 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e  of(CollSeq*) + n
1da40 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
1da50 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1da60 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1da70 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71   = (KeyInfo *)sq
1da80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1da90 6f 28 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a 0a  o(db, nBytes);..
1daa0 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
1dab0 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50 61    pKey->db = pPa
1dac0 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b 65  rse->db;.    pKe
1dad0 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  y->aSortOrder = 
1dae0 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43  (u8 *)&(pKey->aC
1daf0 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20  oll[nCol]);.    
1db00 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61  assert( &pKey->a
1db10 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d  SortOrder[nCol]=
1db20 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b  =&(((u8 *)pKey)[
1db30 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20  nBytes]) );.    
1db40 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
1db50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
1db60 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
1db70 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
1db80 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20    assert( zColl 
1db90 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61  );.      pKey->a
1dba0 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
1dbb0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
1dbc0 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
1dbd0 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74       pKey->aSort
1dbe0 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d  Order[i] = pIdx-
1dbf0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a  >aSortOrder[i];.
1dc00 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e      }.    pKey->
1dc10 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 43  nField = (u16)nC
1dc20 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ol;.  }..  if( p
1dc30 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
1dc40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1dc50 28 64 62 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  (db, pKey);.    
1dc60 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pKey = 0;.  }.  
1dc70 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a     return pKey;.}.