/ Hex Artifact Content
Login

Artifact 821d4b3c6b1da068a4eb1e9c8c414b75612d34c2:


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 74 41 74  o>0 ){.      tAt
1210: 74 61 63 68 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20  tachMask mask;. 
1220: 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
1230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1240: 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73  umpHere(v, pPars
1250: 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29  e->cookieGoto-1)
1260: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
1270: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
1280: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
1290: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
12a0: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
12b0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
12c0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
12d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12e0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
12f0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
1300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1310: 28 76 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  (v,OP_Transactio
1320: 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20  n, iDb, (mask & 
1330: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
1340: 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  k)!=0);.        
1350: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1360: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
1370: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1380: 4f 70 33 28 76 2c 20 4f 50 5f 56 65 72 69 66 79  Op3(v, OP_Verify
1390: 43 6f 6f 6b 69 65 2c 0a 20 20 20 20 20 20 20 20  Cookie,.        
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 69 44 62 2c 20 70 50 61 72 73 65 2d      iDb, pParse-
13c0: 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
13d0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
13f0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
1400: 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74 69 6f 6e  ema->iGeneration
1410: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1420: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1430: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1440: 54 41 42 4c 45 0a 20 20 20 20 20 20 7b 0a 20 20  TABLE.      {.  
1450: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1460: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1470: 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63  pParse->nVtabLoc
1480: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
1490: 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d 20     char *vtab = 
14a0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47  (char *)sqlite3G
14b0: 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50 61  etVTable(db, pPa
14c0: 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b  rse->apVtabLock[
14d0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  i]);.          s
14e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14f0: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
1500: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
1510: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 20 20  _VTAB);.        
1520: 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  }.        pParse
1530: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b  ->nVtabLock = 0;
1540: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1550: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61  .      /* Once a
1560: 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68  ll the cookies h
1570: 61 76 65 20 62 65 65 6e 20 76 65 72 69 66 69 65  ave been verifie
1580: 64 20 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  d and transactio
1590: 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20  ns opened, .    
15a0: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20    ** obtain the 
15b0: 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c  required table-l
15c0: 6f 63 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20  ocks. This is a 
15d0: 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65  no-op unless the
15e0: 20 0a 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65   .      ** share
15f0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
1600: 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
1610: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54    */.      codeT
1620: 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65  ableLocks(pParse
1630: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
1640: 74 69 61 6c 69 7a 65 20 61 6e 79 20 41 55 54 4f  tialize any AUTO
1650: 49 4e 43 52 45 4d 45 4e 54 20 64 61 74 61 20 73  INCREMENT data s
1660: 74 72 75 63 74 75 72 65 73 20 72 65 71 75 69 72  tructures requir
1670: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1680: 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e     sqlite3Autoin
1690: 63 72 65 6d 65 6e 74 42 65 67 69 6e 28 70 50 61  crementBegin(pPa
16a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
16b0: 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61  Finally, jump ba
16c0: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
16d0: 69 6e 67 20 6f 66 20 74 68 65 20 65 78 65 63 75  ing of the execu
16e0: 74 61 62 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20  table code. */. 
16f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1700: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1710: 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f  o, 0, pParse->co
1720: 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d  okieGoto);.    }
1730: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20  .  }...  /* Get 
1740: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
1750: 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75   ready for execu
1760: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tion.  */.  if( 
1770: 76 20 26 26 20 41 4c 57 41 59 53 28 70 50 61 72  v && ALWAYS(pPar
1780: 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20  se->nErr==0) && 
1790: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
17a0: 64 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  d ){.#ifdef SQLI
17b0: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 46 49 4c  TE_DEBUG.    FIL
17c0: 45 20 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e  E *trace = (db->
17d0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
17e0: 64 62 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73  dbeTrace)!=0 ? s
17f0: 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73  tdout : 0;.    s
1800: 71 6c 69 74 65 33 56 64 62 65 54 72 61 63 65 28  qlite3VdbeTrace(
1810: 76 2c 20 74 72 61 63 65 29 3b 0a 23 65 6e 64 69  v, trace);.#endi
1820: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  f.    assert( pP
1830: 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1840: 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69 73 61  l==0 );  /* Disa
1850: 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e 61 62  bles and re-enab
1860: 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  les match */.   
1870: 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20 6f 66   /* A minimum of
1880: 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73 20 72   one cursor is r
1890: 65 71 75 69 72 65 64 20 69 66 20 61 75 74 6f 69  equired if autoi
18a0: 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73 65 64  ncrement is used
18b0: 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69 63 6b  .    *  See tick
18c0: 65 74 20 5b 61 36 39 36 33 37 39 63 31 66 30 38  et [a696379c1f08
18d0: 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66 28 20  866] */.    if( 
18e0: 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21 3d 30  pParse->pAinc!=0
18f0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 61 62   && pParse->nTab
1900: 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e 6e 54  ==0 ) pParse->nT
1910: 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69  ab = 1;.    sqli
1920: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
1930: 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  (v, pParse->nVar
1940: 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a  , pParse->nMem,.
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
1970: 3e 6e 54 61 62 2c 20 70 50 61 72 73 65 2d 3e 6e  >nTab, pParse->n
1980: 4d 61 78 41 72 67 2c 20 70 50 61 72 73 65 2d 3e  MaxArg, pParse->
1990: 65 78 70 6c 61 69 6e 2c 0a 20 20 20 20 20 20 20  explain,.       
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74    pParse->isMult
19c0: 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65  iWrite && pParse
19d0: 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 20  ->mayAbort);.   
19e0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
19f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70  LITE_DONE;.    p
1a00: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
1a10: 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  et = 0;.  }else{
1a20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1a30: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1a40: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
1a50: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
1a60: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
1a70: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
1a80: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
1a90: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1aa0: 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  okieMask = 0;.  
1ab0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1ac0: 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  to = 0;.}../*.**
1ad0: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
1ae0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1af0: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
1b00: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
1b10: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
1b20: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1b30: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
1b40: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
1b50: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
1b60: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
1b70: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
1b80: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
1b90: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
1ba0: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
1bb0: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
1bc0: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
1bd0: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
1be0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
1bf0: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
1c00: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
1c10: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
1c20: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
1c30: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
1c40: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
1c50: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
1c60: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
1c70: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
1c80: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
1c90: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
1ca0: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
1cb0: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
1cc0: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
1cd0: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
1ce0: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
1cf0: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
1d00: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
1d10: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
1d20: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
1d30: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
1d40: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
1d50: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1d60: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
1d70: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
1d80: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
1d90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1da0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64   pParse->db;.# d
1db0: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
1dc0: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
1dd0: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
1de0: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
1df0: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
1e00: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1e10: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
1e20: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1e30: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
1e40: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
1e50: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
1e60: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
1e70: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1e80: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
1e90: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c  ite3VMPrintf(db,
1ea0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
1eb0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
1ec0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
1ed0: 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41    return;   /* A
1ee0: 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   malloc must hav
1ef0: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  e failed */.  }.
1f00: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1f10: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
1f20: 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e  eBuf, &pParse->n
1f30: 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Var, SAVE_SZ);. 
1f40: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
1f50: 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53  >nVar, 0, SAVE_S
1f60: 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e  Z);.  sqlite3Run
1f70: 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a  Parser(pParse, z
1f80: 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  Sql, &zErrMsg);.
1f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1fa0: 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
1fb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1fc0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70  , zSql);.  memcp
1fd0: 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  y(&pParse->nVar,
1fe0: 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53   saveBuf, SAVE_S
1ff0: 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65  Z);.  pParse->ne
2000: 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sted--;.}../*.**
2010: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2020: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2030: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2040: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2050: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2060: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2070: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2080: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2090: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
20a0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
20b0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
20c0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
20d0: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
20e0: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
20f0: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
2100: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
2110: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
2120: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
2130: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
2140: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
2150: 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63  cking for duplic
2160: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  ate table.** nam
2170: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2180: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2190: 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  s TEMP first, th
21a0: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
21b0: 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  y.** auxiliary d
21c0: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75  atabases added u
21d0: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
21e0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
21f0: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
2200: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
2210: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
2220: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33  indTable(sqlite3
2230: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
2240: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
2250: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
2260: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
2270: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2280: 6e 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  nName;.  assert(
2290: 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 6e   zName!=0 );.  n
22a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
22b0: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
22c0: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
22d0: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
22e0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
22f0: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2300: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
2310: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2320: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
2330: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
2340: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2350: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
2360: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
2370: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
2380: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
2390: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
23a0: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e  blHash, zName, n
23b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
23c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
23d0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
23e0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
23f0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2400: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2410: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2420: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
2430: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
2440: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
2450: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
2460: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
2470: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
2480: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
2490: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
24a0: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
24b0: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
24c0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
24d0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
24e0: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
24f0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2500: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
2510: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2520: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
2530: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
2540: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2550: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
2560: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
2570: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
2580: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
2590: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
25a0: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
25b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
25c0: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
25d0: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
25e0: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rors */.  int is
25f0: 56 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  View,           
2600: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b   /* True if look
2610: 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72  ing for a VIEW r
2620: 61 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42  ather than a TAB
2630: 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LE */.  const ch
2640: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f  ar *zName,     /
2650: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
2660: 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ble we are looki
2670: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  ng for */.  cons
2680: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20  t char *zDbase  
2690: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
26a0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67  e database.  Mig
26b0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
26c0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
26d0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
26e0: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
26f0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2700: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2710: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2720: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
2730: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2740: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
2750: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
2760: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
2770: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2780: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
2790: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
27a0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
27b0: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
27c0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
27d0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56  char *zMsg = isV
27e0: 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76  iew ? "no such v
27f0: 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20  iew" : "no such 
2800: 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20  table";.    if( 
2810: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
2820: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2830: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
2840: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73  %s", zMsg, zDbas
2850: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
2860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2870: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2880: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
2890: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
28a0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
28b0: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
28c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
28d0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
28e0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
28f0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
2900: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
2910: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
2920: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
2930: 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  hat index.** and
2940: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2950: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
2960: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
2970: 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c  x..** Return NUL
2980: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
2990: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
29a0: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
29b0: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
29c0: 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74  hed for the.** t
29d0: 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72  able and the fir
29e0: 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65  st matching inde
29f0: 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  x is returned.  
2a00: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  (No checking.** 
2a10: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e  for duplicate in
2a20: 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  dex names is don
2a30: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
2a40: 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50  order is.** TEMP
2a50: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
2a60: 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69  N, then any auxi
2a70: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
2a80: 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74  added.** using t
2a90: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
2aa0: 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  d..*/.Index *sql
2ab0: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71  ite3FindIndex(sq
2ac0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
2ad0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
2ae0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
2af0: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a    Index *p = 0;.
2b00: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
2b10: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
2b20: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
2b30: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
2b40: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
2b50: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2b60: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2b70: 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d  ;  /* Search TEM
2b80: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
2b90: 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
2ba0: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a  hema = db->aDb[j
2bb0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61  ].pSchema;.    a
2bc0: 73 73 65 72 74 28 20 70 53 63 68 65 6d 61 20 29  ssert( pSchema )
2bd0: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
2be0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2bf0: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
2c00: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
2c10: 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e;.    p = sqlit
2c20: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
2c30: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
2c40: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
2c50: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
2c60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
2c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
2c80: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
2c90: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
2ca0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2cb0: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
2cc0: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
2cd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ce0: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
2cf0: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
2d00: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
2d10: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62  ndif.  sqlite3Db
2d20: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c  Free(db, p->zCol
2d30: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Aff);.  sqlite3D
2d40: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
2d50: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
2d60: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
2d70: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
2d80: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
2d90: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
2da0: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
2db0: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
2dc0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
2dd0: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
2de0: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
2df0: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
2e00: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
2e10: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
2e20: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
2e30: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
2e40: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
2e50: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2e60: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
2e70: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
2e80: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
2e90: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68   int len;.  Hash
2ea0: 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61   *pHash = &db->a
2eb0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
2ec0: 3e 69 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e  >idxHash;..  len
2ed0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2ee0: 33 30 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20  30(zIdxName);.  
2ef0: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
2f00: 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68  HashInsert(pHash
2f10: 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2c  , zIdxName, len,
2f20: 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   0);.  if( pInde
2f30: 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e  x ){.    if( pIn
2f40: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
2f50: 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  dex==pIndex ){. 
2f60: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61       pIndex->pTa
2f70: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  ble->pIndex = pI
2f80: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
2f90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
2fa0: 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a  dex *p;.      /*
2fb0: 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f   Justification o
2fc0: 66 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65  f ALWAYS();  The
2fd0: 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f   index must be o
2fe0: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20  n the list of.  
2ff0: 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20      ** indices. 
3000: 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e  */.      p = pIn
3010: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
3020: 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
3030: 28 20 41 4c 57 41 59 53 28 70 29 20 26 26 20 70  ( ALWAYS(p) && p
3040: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20  ->pNext!=pIndex 
3050: 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  ){ p = p->pNext;
3060: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
3070: 41 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78  AYS(p && p->pNex
3080: 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  t==pIndex) ){.  
3090: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
30a0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
30b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30c0: 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20    freeIndex(db, 
30d0: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64  pIndex);.  }.  d
30e0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
30f0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
3100: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
3110: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
3120: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
3130: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
3140: 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73  tables of.** a s
3150: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20  ingle database. 
3160: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3170: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61   called to recla
3180: 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66  im memory.** bef
3190: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
31a0: 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20   closes.  It is 
31b0: 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69  also called duri
31c0: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ng a rollback.**
31d0: 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73   if there were s
31e0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75  chema changes du
31f0: 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ring the transac
3200: 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20  tion or if a.** 
3210: 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69  schema-cookie mi
3220: 73 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a  smatch occurs..*
3230: 2a 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 20 74  *.** If iDb==0 t
3240: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
3250: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61  ternal schema ta
3260: 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74  bles for all dat
3270: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20  abase.** files. 
3280: 20 49 66 20 69 44 62 3e 3d 31 20 74 68 65 6e 20   If iDb>=1 then 
3290: 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
32a0: 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e  al schema for on
32b0: 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65  ly the.** single
32c0: 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e   file indicated.
32d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
32e0: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
32f0: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ema(sqlite3 *db,
3300: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
3310: 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74 28   i, j;.  assert(
3320: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
3330: 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28  b->nDb );..  if(
3340: 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73   iDb==0 ){.    s
3350: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
3360: 41 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 20 20 66  All(db);.  }.  f
3370: 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e  or(i=iDb; i<db->
3380: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
3390: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
33a0: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
33b0: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
33c0: 20 20 20 20 61 73 73 65 72 74 28 69 3d 3d 31 20      assert(i==1 
33d0: 7c 7c 20 28 70 44 62 2d 3e 70 42 74 20 26 26 20  || (pDb->pBt && 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 44 62 2d 3e 70 42 74 29  sMutex(pDb->pBt)
3400: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
3410: 33 53 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d  3SchemaFree(pDb-
3420: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
3430: 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29  .    if( iDb>0 )
3440: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
3450: 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b  ssert( iDb==0 );
3460: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
3470: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
3480: 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  anges;.  sqlite3
3490: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
34a0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
34b0: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
34c0: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20  .  /* If one or 
34d0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69  more of the auxi
34e0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
34f0: 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c  iles has been cl
3500: 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  osed,.  ** then 
3510: 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
3520: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
3530: 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57  atabase list.  W
3540: 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20  e take the.  ** 
3550: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64  opportunity to d
3560: 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63  o this here sinc
3570: 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64  e we have just d
3580: 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68  eleted all of th
3590: 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61  e.  ** schema ha
35a0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
35b0: 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68  erefore do not h
35c0: 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  ave to make any 
35d0: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
35e0: 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62  any of those tab
35f0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
3600: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
3610: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
3620: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
3630: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
3640: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
3650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3660: 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e  Free(db, pDb->zN
3670: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
3680: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
3690: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
36a0: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
36b0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
36c0: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
36d0: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
36e0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
36f0: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
3700: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
3710: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
3720: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
3730: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
3740: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
3750: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
3760: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
3770: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
3780: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
3790: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ));.    sqlite3D
37a0: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
37b0: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
37c0: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
37d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
37e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
37f0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d  lled when a comm
3800: 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  it occurs..*/.vo
3810: 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
3820: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
3830: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
3840: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
3850: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
3860: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  es;.}../*.** Del
3870: 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ete memory alloc
3880: 61 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c  ated for the col
3890: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74  umn names of a t
38a0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68  able or view (th
38b0: 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b  e.** Table.aCol[
38c0: 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 73 74 61  ] array)..*/.sta
38d0: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44  tic void sqliteD
38e0: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
38f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
3900: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
3910: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
3920: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
3930: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
3940: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
3950: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
3960: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
3970: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
3980: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
3990: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
39a0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
39b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
39c0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
39d0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
39e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
39f0: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
3a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3a10: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
3a20: 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Type);.      sql
3a30: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
3a40: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Col->zColl);.   
3a50: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
3a60: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
3a70: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >aCol);.  }.}../
3a80: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
3a90: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
3aa0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3ab0: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
3ac0: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
3ad0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3ae0: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
3af0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
3b00: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
3b10: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
3b20: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
3b30: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
3b40: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
3b50: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
3b60: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
3b70: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
3b80: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
3b90: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
3ba0: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
3bb0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
3bc0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
3bd0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  the table..*/.vo
3be0: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
3bf0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
3c00: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
3c10: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
3c20: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 61  ex, *pNext;..  a
3c30: 73 73 65 72 74 28 20 21 70 54 61 62 6c 65 20 7c  ssert( !pTable |
3c40: 7c 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30  | pTable->nRef>0
3c50: 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   );..  /* Do not
3c60: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
3c70: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
3c80: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
3c90: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
3ca0: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
3cb0: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
3cc0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
3cd0: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
3ce0: 54 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29 20  Table->nRef)>0) 
3cf0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
3d00: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
3d10: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3d20: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  th this table. *
3d30: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
3d40: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
3d50: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
3d60: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
3d70: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
3d80: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
3d90: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  Index->pSchema==
3da0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
3db0: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 20 7c  );.    if( !db |
3dc0: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
3dd0: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ed==0 ){.      c
3de0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e  har *zName = pIn
3df0: 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20  dex->zName; .   
3e00: 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e     TESTONLY ( In
3e10: 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71  dex *pOld = ) sq
3e20: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3e30: 0a 09 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63  ..  &pIndex->pSc
3e40: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
3e50: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
3e60: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30 0a  len30(zName), 0.
3e70: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
3e80: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e  ssert( pOld==pIn
3e90: 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29  dex || pOld==0 )
3ea0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
3eb0: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
3ec0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
3ed0: 65 74 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20  ete any foreign 
3ee0: 6b 65 79 73 20 61 74 74 61 63 68 65 64 20 74 6f  keys attached to
3ef0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
3f00: 20 20 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74    sqlite3FkDelet
3f10: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a  e(db, pTable);..
3f20: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
3f30: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
3f40: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
3f50: 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d  qliteDeleteColum
3f60: 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c  nNames(db, pTabl
3f70: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
3f80: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
3f90: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
3fa0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
3fb0: 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  le->zColAff);.  
3fc0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
3fd0: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ete(db, pTable->
3fe0: 70 53 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65  pSelect);.#ifnde
3ff0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
4000: 45 43 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ECK.  sqlite3Exp
4010: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  rDelete(db, pTab
4020: 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e  le->pCheck);.#en
4030: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
4040: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4050: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
4060: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
4070: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
4080: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4090: 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTable);.}../*.*
40a0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
40b0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
40c0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
40d0: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
40e0: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
40f0: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
4100: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
4110: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
4120: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
4130: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
4140: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4150: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
4160: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
4170: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
4180: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
4190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
41a0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
41b0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
41c0: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
41d0: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
41e0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
41f0: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
4200: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
4210: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
4220: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
4230: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
4240: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
4250: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
4260: 7a 54 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20  zTabName,.      
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33    sqlite3Strlen3
4290: 30 28 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a  0(zTabName),0);.
42a0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
42b0: 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64  able(db, p);.  d
42c0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
42d0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
42e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
42f0: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
4300: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
4310: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
4320: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
4330: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
4340: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
4350: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
4360: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
4370: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
4380: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
4390: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
43a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
43b0: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
43c0: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
43d0: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
43e0: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
43f0: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
4400: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
4410: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
4420: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
4430: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
4440: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
4450: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
4460: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
4470: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
4480: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
4490: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
44a0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
44b0: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
44c0: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
44d0: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
44e0: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
44f0: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
4500: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
4510: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
4520: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
4530: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
4540: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
4550: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
4560: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
4570: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
4580: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
4590: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
45a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
45b0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
45c0: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
45d0: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
45e0: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
45f0: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
4600: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
4610: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
4620: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
4630: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
4640: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
4650: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
4660: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
4670: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
4680: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
4690: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
46a0: 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41  _ROOT, 1, SCHEMA
46b0: 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20  _TABLE(iDb));.  
46c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46d0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
46e0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
46f0: 54 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  T, iDb);.  sqlit
4700: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
4710: 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c  , -1, (char *)5,
4720: 20 50 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20   P4_INT32);  /* 
4730: 35 20 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a  5 column table *
4740: 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d  /.  if( p->nTab=
4750: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61  =0 ){.    p->nTa
4760: 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b = 1;.  }.}../*
4770: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e  .** Parameter zN
4780: 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ame points to a 
4790: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62  nul-terminated b
47a0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
47b0: 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
47c0: 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69  a database ("mai
47d0: 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68  n", "temp" or th
47e0: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
47f0: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a  ached db). This.
4800: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
4810: 72 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66  rns the index of
4820: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
4830: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
4840: 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68  , or.** -1 if th
4850: 65 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f  e named db canno
4860: 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69  t be found..*/.i
4870: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
4880: 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Name(sqlite3 *db
4890: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
48a0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
48b0: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  -1;         /* D
48c0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
48d0: 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  /.  if( zName ){
48e0: 0a 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  .    Db *pDb;.  
48f0: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
4900: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
4910: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d  ;.    for(i=(db-
4920: 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62  >nDb-1), pDb=&db
4930: 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20  ->aDb[i]; i>=0; 
4940: 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20  i--, pDb--){.   
4950: 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45     if( (!OMIT_TE
4960: 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26  MPDB || i!=1 ) &
4970: 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  & n==sqlite3Strl
4980: 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29  en30(pDb->zName)
4990: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30   && .          0
49a0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
49b0: 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  (pDb->zName, zNa
49c0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
49d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
49e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
49f0: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   i;.}../*.** The
4a00: 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f   token *pName co
4a10: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
4a20: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65  of a database (e
4a30: 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a  ither "main" or.
4a40: 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ** "temp" or the
4a50: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
4a60: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72  ched db). This r
4a70: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
4a80: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
4a90: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4aa0: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4ab0: 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  or -1 if the nam
4ac0: 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e  ed db .** does n
4ad0: 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74  ot exist..*/.int
4ae0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73   sqlite3FindDb(s
4af0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
4b00: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
4b10: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
4b40: 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
4b50: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b70: 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65  * Name we are se
4b80: 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  arching for */. 
4b90: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
4ba0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
4bb0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20  , pName);.  i = 
4bc0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
4bd0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
4be0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4bf0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
4c00: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
4c10: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
4c20: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
4c30: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
4c40: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
4c50: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
4c60: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
4c70: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
4c80: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
4c90: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
4ca0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4cb0: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
4cc0: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
4cd0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
4ce0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
4cf0: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
4d00: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
4d10: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
4d20: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
4d30: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
4d40: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
4d50: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
4d60: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4d70: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
4d80: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
4d90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
4da0: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
4db0: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
4dc0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
4dd0: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
4de0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
4df0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
4e00: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
4e10: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
4e20: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
4e30: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
4e40: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
4e50: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
4e60: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4e70: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
4e80: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
4e90: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
4ea0: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
4eb0: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
4ec0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
4ed0: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
4ee0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
4ef0: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
4f00: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
4f10: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
4f20: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
4f30: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
4f40: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
4f50: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
4f60: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f80: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
4f90: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
4fa0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
4fb0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
4fc0: 28 20 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21  ( ALWAYS(pName2!
4fd0: 3d 30 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  =0) && pName2->n
4fe0: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  >0 ){.    if( db
4ff0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a  ->init.busy ) {.
5000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
5010: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
5020: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22  orrupt database"
5030: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
5040: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
5050: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
5060: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
5070: 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d  Name2;.    iDb =
5080: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
5090: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
50a0: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
50b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
50c0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
50d0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
50e0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
50f0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
5100: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
5110: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
5120: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
5130: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
5140: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
5150: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
5160: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55  nit.iDb;.    *pU
5170: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a  nqual = pName1;.
5180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62    }.  return iDb
5190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
51a0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
51b0: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
51c0: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61  UTF-8 string zNa
51d0: 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a  me is a legal.**
51e0: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   unqualified nam
51f0: 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65  e for a new sche
5200: 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65  ma object (table
5210: 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72  , index, view or
5220: 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c  .** trigger). Al
5230: 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61  l names are lega
5240: 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74  l except those t
5250: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74  hat begin with t
5260: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71  he string.** "sq
5270: 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72  lite_" (in upper
5280: 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64  , lower or mixed
5290: 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72   case). This por
52a0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65  tion of the name
52b0: 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65  space.** is rese
52c0: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
52d0: 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  l use..*/.int sq
52e0: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
52f0: 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72  Name(Parse *pPar
5300: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
5310: 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70  zName){.  if( !p
5320: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
5330: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
5340: 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20  nested==0 .     
5350: 20 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d       && (pParse-
5360: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
5370: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29  ITE_WriteSchema)
5380: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
5390: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
53a0: 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  Cmp(zName, "sqli
53b0: 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20  te_", 7) ){.    
53c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
53d0: 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20  pParse, "object 
53e0: 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f  name reserved fo
53f0: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20  r internal use: 
5400: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
5410: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
5420: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
5430: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5440: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e  ./*.** Begin con
5450: 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20  structing a new 
5460: 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  table representa
5470: 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  tion in memory. 
5480: 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20   This is.** the 
5490: 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c  first of several
54a0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
54b0: 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64   that get called
54c0: 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20   in response.** 
54d0: 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  to a CREATE TABL
54e0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e  E statement.  In
54f0: 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69   particular, thi
5500: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5510: 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65  led.** after see
5520: 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41  ing tokens "CREA
5530: 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20  TE" and "TABLE" 
5540: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61  and the table na
5550: 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a  me. The isTemp.*
5560: 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  * flag is true i
5570: 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75  f the table shou
5580: 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ld be stored in 
5590: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
55a0: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
55b0: 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65  nstead of in the
55c0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
55d0: 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ile.  This is no
55e0: 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a  rmally the case.
55f0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d  ** when the "TEM
5600: 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59  P" or "TEMPORARY
5610: 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73  " keyword occurs
5620: 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43   in between.** C
5630: 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e  REATE and TABLE.
5640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74  .**.** The new t
5650: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69  able record is i
5660: 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70  nitialized and p
5670: 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e  ut in pParse->pN
5680: 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d  ewTable..** As m
5690: 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54  ore of the CREAT
56a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
56b0: 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64  t is parsed, add
56c0: 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a  itional action.*
56d0: 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  * routines will 
56e0: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64  be called to add
56f0: 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
5700: 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64  n to this record
5710: 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
5720: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
5730: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  BLE statement, t
5740: 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  he sqlite3EndTab
5750: 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  le() routine.** 
5760: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d  is called to com
5770: 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72  plete the constr
5780: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  uction of the ne
5790: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a  w table record..
57a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
57b0: 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72  tartTable(.  Par
57c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
57d0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
57e0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
57f0: 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70  e1,   /* First p
5800: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
5810: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
5820: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
5830: 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65  *pName2,   /* Se
5840: 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65  cond part of the
5850: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
5860: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
5870: 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20  int isTemp,     
5880: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
5890: 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65   is a TEMP table
58a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77   */.  int isView
58b0: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
58c0: 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57  f this is a VIEW
58d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74   */.  int isVirt
58e0: 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69  ual,   /* True i
58f0: 66 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54  f this is a VIRT
5900: 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  UAL table */.  i
5910: 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
5920: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66  /* Do nothing if
5930: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
5940: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
5950: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63  ble *pTable;.  c
5960: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
5970: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74  /* The name of t
5980: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
5990: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
59a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
59b0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62  be *v;.  int iDb
59c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
59d0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20  abase number to 
59e0: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
59f0: 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a   in */.  Token *
5a00: 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71  pName;    /* Unq
5a10: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
5a20: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72   the table to cr
5a30: 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  eate */..  /* Th
5a40: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
5a50: 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69  name to create i
5a60: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
5a70: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
5a80: 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20  ens.  ** pName1 
5a90: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
5aa0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
5ab0: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
5ac0: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
5ad0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
5ae0: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
5af0: 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a  ...);.  ** .  **
5b00: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5b10: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
5b20: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
5b30: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
5b40: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62   if.  ** the tab
5b50: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
5b60: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5b70: 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  i.e.:.  **.  ** 
5b80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
5b90: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  (...);.  **.  **
5ba0: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5bb0: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
5bc0: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20   pName2 is "".. 
5bd0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c   **.  ** The cal
5be0: 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65  l below sets the
5bf0: 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74   pName pointer t
5c00: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
5c10: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
5c20: 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61    ** pName2) tha
5c30: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
5c40: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
5c50: 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c  ame. The variabl
5c60: 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65  e iDb is.  ** se
5c70: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
5c80: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
5c90: 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72  hat the table or
5ca0: 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20   view is to be. 
5cb0: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a   ** created in..
5cc0: 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c    */.  iDb = sql
5cd0: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
5ce0: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
5cf0: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
5d00: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
5d10: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d  eturn;.  if( !OM
5d20: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
5d30: 65 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  emp && pName2->n
5d40: 3e 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a  >0 && iDb!=1 ){.
5d50: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
5d60: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
5d70: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
5d80: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20  t be qualified. 
5d90: 55 6e 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74  Unless .    ** t
5da0: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
5db0: 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61   is "temp" anywa
5dc0: 79 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  y.  */.    sqlit
5dd0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5de0: 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61  e, "temporary ta
5df0: 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ble name must be
5e00: 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a   unqualified");.
5e10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5e20: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5e30: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69  DB && isTemp ) i
5e40: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
5e50: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
5e60: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
5e70: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
5e80: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
5e90: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
5ea0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
5eb0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
5ec0: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
5ed0: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
5ee0: 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62  e) ){.    goto b
5ef0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
5f00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
5f10: 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73  init.iDb==1 ) is
5f20: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
5f30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5f40: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
5f50: 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20  sert( (isTemp & 
5f60: 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20  1)==isTemp );.  
5f70: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
5f80: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
5f90: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
5fa0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
5fb0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
5fc0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
5fd0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
5fe0: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
5ff0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
6000: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6010: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
6020: 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
6030: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
6040: 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20  B && isTemp ){. 
6050: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
6060: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
6070: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
6080: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
6090: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
60a0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20  _VIEW;.      }. 
60b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
60c0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
60d0: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
60e0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
60f0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
6100: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
6110: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
6120: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
6130: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  _TABLE;.      }.
6140: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
6150: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
6160: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
6170: 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65  rse, code, zName
6180: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
6190: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
61a0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
61b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
61c0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
61d0: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64  new table name d
61e0: 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20  oes not collide 
61f0: 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67  with an existing
6200: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
6210: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
6220: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20   same database. 
6230: 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20   Issue an error 
6240: 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20  message if.  ** 
6250: 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63  it does. The exc
6260: 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65  eption is if the
6270: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
6280: 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73   parsed was pass
6290: 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71  ed.  ** to an sq
62a0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
62b0: 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68  ab() call. In th
62c0: 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65  at case only the
62d0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20   column names.  
62e0: 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c  ** and types wil
62f0: 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68  l be used, so th
6300: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
6310: 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73  o test for names
6320: 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73  pace.  ** collis
6330: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
6340: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
6350: 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  B ){.    char *z
6360: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
6370: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
6380: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
6390: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
63a0: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67  arse) ){.      g
63b0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
63c0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
63d0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
63e0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
63f0: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20  Name, zDb);.    
6400: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
6410: 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29      if( !noErr )
6420: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6430: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6440: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
6450: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
6460: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
6470: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6480: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
6490: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
64a0: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
64b0: 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a  ame, zDb)!=0 ){.
64c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
64d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
64e0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
64f0: 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25  an index named %
6500: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
6510: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6520: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
6530: 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20    }..  pTable = 
6540: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6550: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
6560: 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54  able));.  if( pT
6570: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64  able==0 ){.    d
6580: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6590: 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 1;.    pParse-
65a0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
65b0: 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  EM;.    pParse->
65c0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
65d0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
65e0: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
65f0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
6600: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  .  pTable->iPKey
6610: 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d   = -1;.  pTable-
6620: 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
6630: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
6640: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20  .  pTable->nRef 
6650: 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 1;.  pTable->n
6660: 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30 30  RowEst = 1000000
6670: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
6680: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
6690: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e   );.  pParse->pN
66a0: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
66b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
66c0: 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c  is the magic sql
66d0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
66e0: 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69  le used by autoi
66f0: 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74  ncrement,.  ** t
6700: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69  hen record a poi
6710: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62  nter to this tab
6720: 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
6730: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
6740: 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49  e.  ** so that I
6750: 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74  NSERT can find t
6760: 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e  he table easily.
6770: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
6780: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
6790: 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  CREMENT.  if( !p
67a0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26  Parse->nested &&
67b0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22   strcmp(zName, "
67c0: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
67d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  )==0 ){.    pTab
67e0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
67f0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
6800: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6810: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
6820: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
6830: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
6840: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
6850: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
6860: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
6870: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
6880: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
6890: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
68a0: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
68b0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
68c0: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
68d0: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
68e0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
68f0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
6900: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
6910: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
6920: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
6930: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
6940: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
6950: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
6960: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
6970: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
6980: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
6990: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
69a0: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
69b0: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
69c0: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
69d0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
69e0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
69f0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
6a00: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  0 ){.    int j1;
6a10: 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72  .    int fileFor
6a20: 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  mat;.    int reg
6a30: 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20  1, reg2, reg3;. 
6a40: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
6a50: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
6a60: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
6a70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6a80: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6a90: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
6aa0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
6ab0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
6ac0: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
6ad0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
6ae0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
6af0: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
6b00: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
6b10: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
6b20: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
6b30: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
6b40: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
6b50: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
6b60: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
6b70: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
6b80: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
6b90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6ba0: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
6bb0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
6bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6bd0: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
6be0: 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45  iDb, reg3, BTREE
6bf0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20  _FILE_FORMAT);. 
6c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
6c10: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
6c20: 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
6c30: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6c40: 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20  P_If, reg3);.   
6c50: 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64   fileFormat = (d
6c60: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6c70: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29  E_LegacyFileFmt)
6c80: 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
6c90: 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49          1 : SQLI
6ca0: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
6cb0: 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT;.    sqlite3V
6cc0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6cd0: 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72  Integer, fileFor
6ce0: 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  mat, reg3);.    
6cf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d00: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
6d10: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49  e, iDb, BTREE_FI
6d20: 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29  LE_FORMAT, reg3)
6d30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6d40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
6d50: 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20  teger, ENC(db), 
6d60: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
6d70: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6d80: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
6d90: 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e  b, BTREE_TEXT_EN
6da0: 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20  CODING, reg3);. 
6db0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
6dc0: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a  mpHere(v, j1);..
6dd0: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
6de0: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
6df0: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
6e00: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
6e10: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
6e20: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
6e30: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
6e40: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
6e50: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
6e60: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
6e70: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
6e80: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
6e90: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
6ea0: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
6eb0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
6ec0: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
6ed0: 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72  try is left in r
6ee0: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
6ef0: 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a  regRowid..    **
6f00: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   The root page n
6f10: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
6f20: 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69   table is left i
6f30: 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65  n reg pParse->re
6f40: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68  gRoot..    ** Th
6f50: 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74  e rowid and root
6f60: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c   page number val
6f70: 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62  ues are needed b
6f80: 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a  y the code that.
6f90: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e      ** sqlite3En
6fa0: 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65  dTable will gene
6fb0: 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  rate..    */.#if
6fc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6fd0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
6fe0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6ff0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7000: 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ).    if( isView
7010: 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b   || isVirtual ){
7020: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7030: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7040: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29  nteger, 0, reg2)
7050: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
7060: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73  if.    {.      s
7070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7080: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
7090: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
70a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
70b0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
70c0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
70d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
70e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
70f0: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
7100: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7110: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
7120: 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73   0, reg3);.    s
7130: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7140: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
7150: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
7160: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7170: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7180: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
7190: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
71a0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
71b0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
71c0: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
71d0: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
71e0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
71f0: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
7200: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
7210: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
7220: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7230: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
7240: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
7250: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
7260: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
7270: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
7280: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
7290: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
72a0: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
72b0: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
72c0: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
72d0: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
72e0: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
72f0: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
7300: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
7310: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
7320: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
7330: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
7340: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
7350: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
7360: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
7370: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
7380: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
7390: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
73a0: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
73b0: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
73c0: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
73d0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
73e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
73f0: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
7400: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
7410: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
7420: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
7430: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
7440: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
7450: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
7460: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
7470: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
7480: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
7490: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
74a0: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
74b0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
74c0: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
74d0: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
74e0: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
74f0: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
7500: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
7510: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
7520: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
7530: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
7540: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
7550: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
7560: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
7570: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
7580: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
7590: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
75a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
75b0: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d  ->db;.  if( (p =
75c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
75d0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
75e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
75f0: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
7600: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
7610: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
7620: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
7630: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7640: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
7650: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
7660: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
7670: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
7680: 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  f.  z = sqlite3N
7690: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
76a0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
76b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
76c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
76d0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
76e0: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
76f0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
7700: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7710: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7720: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
7730: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
7740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
7750: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
7760: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7770: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
7780: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
7790: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
77a0: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
77b0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
77c0: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
77d0: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
77e0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
77f0: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
7800: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7810: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
7820: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7830: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
7840: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
7850: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
7860: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
7870: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
7880: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
7890: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
78a0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
78b0: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
78c0: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
78d0: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
78e0: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
78f0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
7900: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
7910: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
7920: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
7930: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
7940: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
7950: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
7960: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
7970: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
7980: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
7990: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
79a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
79b0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
79c0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
79d0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
79e0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
79f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7a00: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
7a10: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
7a20: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
7a30: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
7a40: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
7a50: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
7a60: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
7a70: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
7a80: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
7a90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
7aa0: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
7ab0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
7ac0: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
7ad0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
7ae0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
7af0: 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70   p==0 || NEVER(p
7b00: 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75  ->nCol<1) ) retu
7b10: 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d  rn;.  p->aCol[p-
7b20: 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c  >nCol-1].notNull
7b30: 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
7b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
7b50: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
7b60: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
7b70: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
7b80: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
7b90: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
7ba0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  pe..**.** This r
7bb0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61  outine does a ca
7bc0: 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  se-independent s
7bd0: 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66  earch of zType f
7be0: 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74  or the .** subst
7bf0: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c  rings in the fol
7c00: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66  lowing table. If
7c10: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
7c20: 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75  trings is.** fou
7c30: 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  nd, the correspo
7c40: 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69  nding affinity i
7c50: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a  s returned. If z
7c60: 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  Type contains.**
7c70: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f   more than one o
7c80: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7c90: 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64  , entries toward
7ca0: 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20   the top of .** 
7cb0: 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70  the table take p
7cc0: 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61  riority. For exa
7cd0: 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69  mple, if zType i
7ce0: 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a  s 'BLOBINT', .**
7cf0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7d00: 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e  GER is returned.
7d10: 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67  .**.** Substring
7d20: 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a       | Affinity.
7d30: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d50: 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20  ---.** 'INT'    
7d60: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7d70: 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48  F_INTEGER.** 'CH
7d80: 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AR'        | SQL
7d90: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
7da0: 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'CLOB'        | 
7db0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
7dc0: 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20  ** 'TEXT'       
7dd0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
7de0: 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20  XT.** 'BLOB'    
7df0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
7e00: 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20  _NONE.** 'REAL' 
7e10: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7e20: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f  AFF_REAL.** 'FLO
7e30: 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  A'        | SQLI
7e40: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
7e50: 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53  DOUB'        | S
7e60: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
7e70: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
7e80: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7e90: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
7ea0: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
7eb0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
7ec0: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
7ed0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
7ee0: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
7ef0: 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20  t char *zIn){.  
7f00: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
7f10: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
7f20: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69  FF_NUMERIC;..  i
7f30: 66 28 20 7a 49 6e 20 29 20 77 68 69 6c 65 28 20  f( zIn ) while( 
7f40: 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20  zIn[0] ){.    h 
7f50: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
7f60: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28  e3UpperToLower[(
7f70: 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20  *zIn)&0xff];.   
7f80: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
7f90: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
7fa0: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
7fb0: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
7fc0: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
7fd0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7fe0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20  TE_AFF_TEXT; .  
7ff0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8000: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
8010: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
8020: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
8030: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
8040: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
8050: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
8060: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
8070: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
8080: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
8090: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
80a0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
80b0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
80c0: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
80d0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
80e0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
80f0: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
8100: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
8110: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8120: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
8130: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
8140: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8150: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66  TE_AFF_NONE;.#if
8160: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8170: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
8180: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8190: 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27  =(('r'<<24)+('e'
81a0: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
81b0: 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l')          /* 
81c0: 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  REAL */.        
81d0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
81e0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
81f0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8200: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
8210: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66  else if( h==(('f
8220: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
8230: 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20  +('o'<<8)+'a')  
8240: 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20          /* FLOA 
8250: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
8260: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
8270: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
8280: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8290: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
82a0: 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34  if( h==(('d'<<24
82b0: 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27  )+('o'<<16)+('u'
82c0: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
82d0: 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20     /* DOUB */.  
82e0: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
82f0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8300: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
8310: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
8320: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
8330: 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46  e if( (h&0x00FFF
8340: 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29  FFF)==(('i'<<16)
8350: 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('n'<<8)+'t') )
8360: 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20  {    /* INT */. 
8370: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8380: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
8390: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
83a0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
83b0: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
83c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
83d0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
83e0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
83f0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8400: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
8410: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
8420: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
8430: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
8440: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
8450: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
8460: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
8470: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
8480: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
8490: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
84a0: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
84b0: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
84c0: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
84d0: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
84e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
84f0: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
8500: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
8510: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
8520: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
8530: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
8540: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
8550: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
8560: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
8570: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8580: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61  en *pType){.  Ta
8590: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
85a0: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70   *pCol;..  p = p
85b0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
85c0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
85d0: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
85e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
85f0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
8600: 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72  nCol-1];.  asser
8610: 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d  t( pCol->zType==
8620: 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79  0 );.  pCol->zTy
8630: 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  pe = sqlite3Name
8640: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
8650: 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20  ->db, pType);.  
8660: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
8670: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
8680: 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Type(pCol->zType
8690: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
86a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
86b0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
86c0: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
86d0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
86e0: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
86f0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
8700: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8710: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
8720: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
8730: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
8740: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
8750: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
8760: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
8770: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8780: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8790: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
87a0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
87b0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
87c0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
87d0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
87e0: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
87f0: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
8800: 70 50 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e  pParse, ExprSpan
8810: 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c   *pSpan){.  Tabl
8820: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
8830: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
8840: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8850: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
8860: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
8870: 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f   p!=0 ){.    pCo
8880: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
8890: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
88a0: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
88b0: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
88c0: 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72  ion(pSpan->pExpr
88d0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
88e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
88f0: 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75  e, "default valu
8900: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d  e of column [%s]
8910: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
8920: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
8930: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
8940: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
8950: 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69   copy of pExpr i
8960: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  s used instead o
8970: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20  f the original, 
8980: 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e  as pExpr contain
8990: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e  s.      ** token
89a0: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
89b0: 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e  volatile memory.
89c0: 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74   The 'span' of t
89d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
89e0: 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
89f0: 65 64 20 62 79 20 70 72 61 67 6d 61 20 74 61 62  ed by pragma tab
8a00: 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a  le_info..      *
8a10: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
8a20: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
8a30: 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20  ol->pDflt);.    
8a40: 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20    pCol->pDflt = 
8a50: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8a60: 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c  b, pSpan->pExpr,
8a70: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
8a80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
8a90: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
8aa0: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43  zDflt);.      pC
8ab0: 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69  ol->zDflt = sqli
8ac0: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
8ad0: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
8ae0: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
8b10: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
8b20: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
8b30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8b40: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8b50: 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29  b, pSpan->pExpr)
8b60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  ;.}../*.** Desig
8b70: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
8b80: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
8b90: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
8ba0: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
8bb0: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
8bc0: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
8bd0: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
8be0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
8bf0: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
8c00: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
8c10: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
8c20: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
8c30: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
8c40: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
8c50: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
8c60: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
8c70: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
8c80: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
8c90: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
8ca0: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
8cb0: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
8cc0: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
8cd0: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
8ce0: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
8cf0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
8d00: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
8d10: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
8d20: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
8d30: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
8d40: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
8d50: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
8d60: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
8d70: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
8d80: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
8d90: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
8da0: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
8db0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
8dc0: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
8dd0: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
8de0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
8df0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
8e00: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
8e10: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
8e20: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
8e30: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
8e40: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
8e50: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
8e60: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
8e70: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
8e80: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
8e90: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
8ea0: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
8eb0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
8ec0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
8ed0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
8ee0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
8ef0: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
8f00: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
8f10: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
8f20: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
8f30: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
8f40: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
8f50: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
8f60: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
8f70: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
8f80: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
8f90: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
8fa0: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
8fb0: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
8fc0: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
8fd0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
8fe0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8ff0: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79  ble;.  char *zTy
9000: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  pe = 0;.  int iC
9010: 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66  ol = -1, i;.  if
9020: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f  ( pTab==0 || IN_
9030: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
9040: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
9050: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
9060: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
9070: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b  HasPrimaryKey ){
9080: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
9090: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
90a0: 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c      "table \"%s\
90b0: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
90c0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
90d0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
90e0: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
90f0: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
9100: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
9110: 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79  |= TF_HasPrimary
9120: 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  Key;.  if( pList
9130: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
9140: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
9150: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
9160: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
9170: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
9180: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
9190: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
91a0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  {.      for(iCol
91b0: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
91c0: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
91d0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
91e0: 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
91f0: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
9200: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
9210: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
9220: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9230: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9240: 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62     if( iCol<pTab
9250: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
9260: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
9270: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
9280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9290: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
92a0: 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20  Expr>1 ) iCol = 
92b0: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  -1;.  }.  if( iC
92c0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
92d0: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
92e0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
92f0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
9300: 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20    }.  if( zType 
9310: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
9320: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
9330: 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  R")==0.        &
9340: 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  & sortOrder==SQL
9350: 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20  ITE_SO_ASC ){.  
9360: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
9370: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
9380: 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e  keyConf = (u8)on
9390: 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72  Error;.    asser
93a0: 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c  t( autoInc==0 ||
93b0: 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20   autoInc==1 );. 
93c0: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
93d0: 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f  s |= autoInc*TF_
93e0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20  Autoincrement;. 
93f0: 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49   }else if( autoI
9400: 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  nc ){.#ifndef SQ
9410: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
9420: 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69  CREMENT.    sqli
9430: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9440: 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45  se, "AUTOINCREME
9450: 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  NT is only allow
9460: 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20  ed on an ".     
9470: 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41    "INTEGER PRIMA
9480: 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66  RY KEY");.#endif
9490: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
94a0: 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  dex *p;.    p = 
94b0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
94c0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
94d0: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
94e0: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
94f0: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  der, 0);.    if(
9500: 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61   p ){.      p->a
9510: 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20  utoIndex = 2;.  
9520: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
9530: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
9540: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
9550: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9560: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
9570: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
9580: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
9590: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
95a0: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
95b0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
95c0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
95d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
95e0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
95f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9600: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
9610: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9620: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
9630: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
9640: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
9650: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9660: 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
9670: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
9680: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
9690: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
96a0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61  Table;.  if( pTa
96b0: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
96c0: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 54 61  _VTAB ){.    pTa
96d0: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
96e0: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
96f0: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68  Tab->pCheck, pCh
9700: 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73  eckExpr);.  }els
9710: 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
9720: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9730: 74 65 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70  te(db, pCheckExp
9740: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
9750: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
9760: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
9770: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9780: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
9790: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
97a0: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
97b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
97c0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
97d0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
97e0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
97f0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
9800: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
9810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9820: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
9830: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9840: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
9850: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
9860: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9870: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
9880: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
9890: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
98a0: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
98b0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
98c0: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
98d0: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
98e0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
98f0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
9900: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
9910: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
9920: 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43  *pIdx;.    p->aC
9930: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43  ol[i].zColl = zC
9940: 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  oll;.  .    /* I
9950: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
9960: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
9970: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
9980: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
9990: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  .    ** then an 
99a0: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
99b0: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
99c0: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
99d0: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  e the.    ** col
99e0: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
99f0: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
9a00: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
9a10: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
9a20: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
9a30: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
9a40: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
9a50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
9a60: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  x->nColumn==1 );
9a70: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
9a80: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
9a90: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
9aa0: 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e  >azColl[0] = p->
9ab0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[i].zColl;. 
9ac0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9ad0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
9ae0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
9af0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
9b00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9b10: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
9b20: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
9b30: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
9b40: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
9b50: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
9b60: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
9b70: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
9b80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
9b90: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9ba0: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
9bb0: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
9bc0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
9bd0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
9be0: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
9bf0: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
9c00: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
9c10: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
9c20: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
9c30: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
9c40: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
9c50: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
9c60: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
9c70: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
9c80: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
9c90: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
9ca0: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
9cb0: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
9cc0: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
9cd0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
9ce0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
9cf0: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
9d00: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
9d10: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
9d20: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
9d30: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
9d40: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
9d50: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
9d60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9d70: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
9d80: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
9d90: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
9da0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
9db0: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
9dc0: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
9dd0: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
9de0: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
9df0: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
9e00: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
9e10: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  age..**.** See a
9e20: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64  lso: sqlite3Find
9e30: 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74  CollSeq(), sqlit
9e40: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a  e3GetCollSeq().*
9e50: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
9e60: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
9e70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
9e80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
9e90: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9ea0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9eb0: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
9ec0: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
9ed0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
9ee0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
9ef0: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
9f00: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
9f10: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
9f20: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
9f30: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
9f40: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
9f50: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
9f60: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
9f70: 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  etCollSeq(db, en
9f80: 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  c, pColl, zName)
9f90: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
9fa0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9fb0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9fc0: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
9fd0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
9fe0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
9ff0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
a000: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
a010: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
a020: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
a030: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
a040: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
a050: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
a060: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
a070: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
a080: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
a090: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
a0a0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
a0b0: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
a0c0: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
a0d0: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
a0e0: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
a0f0: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
a100: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
a110: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
a120: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
a130: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
a140: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
a150: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
a160: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
a170: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
a180: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
a190: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
a1a0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
a1b0: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
a1c0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
a1d0: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
a1e0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
a1f0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
a200: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
a210: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
a220: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
a230: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
a240: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
a250: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
a260: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
a270: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
a280: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
a290: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
a2a0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
a2b0: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
a2c0: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
a2d0: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
a2e0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
a2f0: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
a300: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
a310: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
a320: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a330: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
a340: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a350: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a360: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c  se->pVdbe;.  sql
a370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a380: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
a390: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
a3a0: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
a3b0: 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  e+1, r1);.  sqli
a3c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a3d0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
a3e0: 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Db, BTREE_SCHEMA
a3f0: 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20  _VERSION, r1);. 
a400: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
a410: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
a420: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  1);.}../*.** Mea
a430: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
a440: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
a450: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
a460: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
a470: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
a480: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
a490: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
a4a0: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
a4b0: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
a4c0: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
a4d0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
a4e0: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
a4f0: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
a500: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
a510: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
a520: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
a530: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
a540: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
a550: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
a560: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
a570: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
a580: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
a590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
a5a0: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 2;.}../*.** Th
a5b0: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
a5c0: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
a5d0: 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66  o an output buff
a5e0: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a  er. The second .
a5f0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
a600: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
a610: 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e  integer that con
a620: 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74  tains the offset
a630: 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20   at.** which to 
a640: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f  write into the o
a650: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
a660: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69  is function copi
a670: 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65  es the.** nul-te
a680: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
a690: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
a6a0: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
a6b0: 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c  r, zSignedIdent,
a6c0: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69  .** to the speci
a6d0: 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74  fied offset in t
a6e0: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70  he buffer and up
a6f0: 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72  dates *pIdx to r
a700: 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  efer.** to the f
a710: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
a720: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72  the last byte wr
a730: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74  itten before ret
a740: 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49  urning..** .** I
a750: 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69  f the string zSi
a760: 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73  gnedIdent consis
a770: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61  ts entirely of a
a780: 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20  lpha-numeric.** 
a790: 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73  characters, does
a7a0: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
a7b0: 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e  a digit and is n
a7c0: 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72  ot an SQL keywor
a7d0: 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
a7e0: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f   copied to the o
a7f0: 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61  utput buffer exa
a800: 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f  ctly as it is. O
a810: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
a820: 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  is quoted using 
a830: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a  double-quotes..*
a840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
a850: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
a860: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
a870: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
a880: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a890: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
a8a0: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
a8b0: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
a8c0: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
a8d0: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66   i = *pIdx;..  f
a8e0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
a8f0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
a900: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
a910: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
a920: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
a930: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
a940: 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  dQuote = sqlite3
a950: 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  Isdigit(zIdent[0
a960: 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79  ]) || sqlite3Key
a970: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
a980: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
a990: 28 20 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a  ( !needQuote ){.
a9a0: 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20      needQuote = 
a9b0: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a  zIdent[j];.  }..
a9c0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
a9d0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
a9e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
a9f0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
aa00: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
aa10: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
aa20: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
aa30: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
aa40: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
aa50: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
aa60: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
aa70: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
aa80: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
aa90: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
aaa0: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
aab0: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
aac0: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
aad0: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
aae0: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
aaf0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
ab00: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
ab10: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
ab20: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
ab30: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
ab40: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
ab50: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
ab60: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
ab70: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
ab80: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
ab90: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
aba0: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
abb0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
abc0: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
abd0: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
abe0: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
abf0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
ac00: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
ac10: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
ac20: 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d   + 5;.  }.  n +=
ac30: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
ac40: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
ac50: 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20  50 ){ .    zSep 
ac60: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
ac70: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
ac80: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
ac90: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
aca0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
acb0: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
acc0: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
acd0: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
ace0: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
acf0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
ad00: 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a  w(0, n);.  if( z
ad10: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  Stmt==0 ){.    d
ad20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ad30: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
ad40: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
ad50: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
ad60: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
ad70: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
ad80: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
ad90: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
ada0: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
adb0: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
adc0: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
add0: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
ade0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
adf0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
ae00: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
ae10: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
ae20: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
ae30: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
ae40: 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a      */ " TEXT",.
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
ae60: 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f  E_AFF_NONE    */
ae70: 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20   "",.        /* 
ae80: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
ae90: 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20  IC */ " NUM",.  
aea0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
aeb0: 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22  AFF_INTEGER */ "
aec0: 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f   INT",.        /
aed0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  * SQLITE_AFF_REA
aee0: 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a  L    */ " REAL".
aef0: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c      };.    int l
af00: 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
af10: 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20  ar *zType;..    
af20: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
af30: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
af40: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
af50: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
af60: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
af70: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
af80: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
af90: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
afa0: 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  me);.    assert(
afb0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
afc0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
afd0: 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
afe0: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
aff0: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  ty-SQLITE_AFF_TE
b000: 58 54 20 3c 20 73 69 7a 65 6f 66 28 61 7a 54 79  XT < sizeof(azTy
b010: 70 65 29 2f 73 69 7a 65 6f 66 28 61 7a 54 79 70  pe)/sizeof(azTyp
b020: 65 5b 30 5d 29 20 29 3b 0a 20 20 20 20 74 65 73  e[0]) );.    tes
b030: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b040: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b050: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
b060: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
b070: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
b080: 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74  FF_NONE );.    t
b090: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
b0a0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
b0b0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
b0c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
b0d0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
b0e0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
b0f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b100: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
b110: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
b120: 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79   );.    .    zTy
b130: 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c  pe = azType[pCol
b140: 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c  ->affinity - SQL
b150: 49 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20  ITE_AFF_TEXT];. 
b160: 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
b170: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
b180: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
b190: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
b1a0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20  ITE_AFF_NONE .  
b1b0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f            || pCo
b1c0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c  l->affinity==sql
b1d0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
b1e0: 28 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d  (zType) );.    m
b1f0: 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  emcpy(&zStmt[k],
b200: 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20   zType, len);.  
b210: 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20    k += len;.    
b220: 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a  assert( k<=n );.
b230: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
b240: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
b250: 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e  mt[k], "%s", zEn
b260: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
b270: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
b280: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b290: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
b2a0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
b2b0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
b2c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
b2d0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
b2e0: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
b2f0: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
b300: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
b310: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
b320: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
b330: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
b340: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
b350: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
b360: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
b370: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
b380: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
b390: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
b3a0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
b3b0: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
b3c0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
b3d0: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
b3e0: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
b3f0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
b400: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
b410: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
b420: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
b430: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
b440: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
b450: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
b460: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
b470: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
b480: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
b490: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
b4a0: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
b4b0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
b4c0: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
b4d0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
b4e0: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
b4f0: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
b500: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
b510: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
b520: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
b530: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
b540: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
b550: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
b560: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
b570: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
b580: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
b590: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
b5a0: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
b5b0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
b5c0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
b5d0: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
b5e0: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
b5f0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
b600: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b610: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
b620: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b630: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
b640: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
b650: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
b660: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
b670: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
b680: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
b690: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b6b0: 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b  he final ')' tok
b6c0: 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  en in the CREATE
b6d0: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65   TABLE */.  Sele
b6e0: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
b6f0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
b700: 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
b710: 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
b720: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
b730: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b740: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
b750: 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  iDb;..  if( (pEn
b760: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
b770: 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
b780: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
b790: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d  eturn;.  }.  p =
b7a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b7b0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
b7c0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
b7d0: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
b7e0: 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  sy || !pSelect )
b7f0: 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  ;..  iDb = sqlit
b800: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
b810: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
b820: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b830: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a  _OMIT_CHECK.  /*
b840: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
b850: 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73  n all CHECK cons
b860: 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f  traint expressio
b870: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
b880: 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
b890: 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20  SrcList sSrc;   
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20  /* Fake SrcList 
b8c0: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
b8d0: 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d  Table */.    Nam
b8e0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b900: 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
b910: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b920: 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65  le */..    memse
b930: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
b940: 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d  f(sNC));.    mem
b950: 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69  set(&sSrc, 0, si
b960: 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20  zeof(sSrc));.   
b970: 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a   sSrc.nSrc = 1;.
b980: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e      sSrc.a[0].zN
b990: 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a  ame = p->zName;.
b9a0: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54      sSrc.a[0].pT
b9b0: 61 62 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63  ab = p;.    sSrc
b9c0: 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20  .a[0].iCursor = 
b9d0: 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  -1;.    sNC.pPar
b9e0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
b9f0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
ba00: 26 73 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69  &sSrc;.    sNC.i
ba10: 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20  sCheck = 1;.    
ba20: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
ba30: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
ba40: 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a  , p->pCheck) ){.
ba50: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
ba60: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
ba70: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
ba80: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
ba90: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
baa0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
bab0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
bac0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
bad0: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
bae0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
baf0: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
bb00: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
bb10: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
bb20: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
bb30: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
bb40: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
bb50: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
bb60: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
bb70: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
bb80: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
bb90: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
bba0: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
bbb0: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
bbc0: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
bbd0: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
bbe0: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
bbf0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
bc00: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
bc10: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
bc20: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20   }..  /* If not 
bc30: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68  initializing, th
bc40: 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f  en create a reco
bc50: 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74  rd for the new t
bc60: 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65  able.  ** in the
bc70: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
bc80: 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61  able of the data
bc90: 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  base..  **.  ** 
bca0: 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  If this is a TEM
bcb0: 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72  PORARY table, wr
bcc0: 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e  ite the entry in
bcd0: 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  to the auxiliary
bce0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  .  ** file inste
bcf0: 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d  ad of into the m
bd00: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
bd10: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  e..  */.  if( !d
bd20: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
bd30: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
bd40: 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
bd50: 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22   *zType;    /* "
bd60: 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22  view" or "table"
bd70: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   */.    char *zT
bd80: 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57  ype2;   /* "VIEW
bd90: 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a  " or "TABLE" */.
bda0: 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
bdb0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74      /* Text of t
bdc0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
bdd0: 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73  or CREATE VIEW s
bde0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20  tatement */..   
bdf0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
be00: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
be10: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
be20: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
be30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
be40: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  1(v, OP_Close, 0
be50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20  );..    /* .    
be60: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  ** Initialize zT
be70: 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ype for the new 
be80: 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20  view or table.. 
be90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
bea0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
beb0: 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61       /* A regula
bec0: 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  r table */.     
bed0: 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22   zType = "table"
bee0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
bef0: 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65   "TABLE";.#ifnde
bf00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
bf10: 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  EW.    }else{.  
bf20: 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
bf30: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
bf40: 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79  view";.      zTy
bf50: 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65  pe2 = "VIEW";.#e
bf60: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
bf70: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
bf80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
bf90: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
bfa0: 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
bfb0: 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
bfc0: 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
bfd0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
bfe0: 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
bff0: 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
c000: 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69  * new table is i
c010: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
c020: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
c030: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
c040: 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
c050: 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
c060: 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
c070: 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
c080: 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
c090: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
c0a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
c0b0: 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
c0c0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
c0d0: 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  ew table..    **
c0e0: 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64  .    ** A shared
c0f0: 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63  -cache write-loc
c100: 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  k is not require
c110: 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
c120: 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20  e new table,.   
c130: 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d   ** as a schema-
c140: 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61  lock must have a
c150: 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61  lready been obta
c160: 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69  ined to create i
c170: 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  t. Since.    ** 
c180: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78  a schema-lock ex
c190: 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72  cludes all other
c1a0: 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c   database users,
c1b0: 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20   the write-lock 
c1c0: 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20  would.    ** be 
c1d0: 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a  redundant..    *
c1e0: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
c1f0: 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  t ){.      Selec
c200: 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
c210: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
c220: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
c230: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29  pParse->nTab==1)
c240: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c250: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c260: 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
c270: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
c280: 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
c290: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
c2a0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  , 1);.      pPar
c2b0: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
c2c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c2d0: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
c2e0: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a   SRT_Table, 1);.
c2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
c300: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
c310: 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
c320: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c330: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
c340: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
c350: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
c360: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
c370: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
c380: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
c390: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
c3a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
c3b0: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
c3c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c3d0: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
c3e0: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
c3f0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
c400: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
c410: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
c420: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
c430: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
c440: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
c450: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
c460: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
c470: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
c480: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
c490: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
c4a0: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
c4b0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
c4c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
c4d0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
c4e0: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
c4f0: 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
c500: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
c510: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
c520: 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  End->z - pParse-
c530: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b  >sNameToken.z) +
c540: 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   1;.      zStmt 
c550: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
c560: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
c570: 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
c580: 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
c590: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
c5a0: 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
c5b0: 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
c5c0: 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
c5d0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
c5e0: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
c5f0: 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
c600: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
c610: 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
c620: 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
c630: 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
c640: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
c650: 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
c660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
c670: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
c680: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
c690: 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
c6a0: 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
c6b0: 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
c6c0: 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
c6d0: 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
c6e0: 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
c6f0: 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
c700: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
c710: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
c720: 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
c730: 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
c740: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
c750: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
c760: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
c770: 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
c780: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
c790: 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
c7a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
c7b0: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
c7c0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
c7d0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
c7e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c7f0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
c800: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
c810: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
c820: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
c830: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
c840: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
c850: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
c860: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
c870: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c880: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54   p->tabFlags & T
c890: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
c8a0: 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
c8b0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
c8c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
c8d0: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
c8e0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
c8f0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
c900: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
c910: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
c920: 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  LE %Q.sqlite_seq
c930: 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22  uence(name,seq)"
c940: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
c950: 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29  >zName.        )
c960: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c970: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52  #endif..    /* R
c980: 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e  eparse everythin
c990: 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20  g to update our 
c9a0: 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74  internal data st
c9b0: 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
c9c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c9d0: 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(v, OP_ParseSch
c9e0: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a  ema, iDb, 0, 0,.
c9f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
ca00: 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
ca10: 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e  name='%q'",p->zN
ca20: 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43  ame), P4_DYNAMIC
ca30: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
ca40: 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
ca50: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
ca60: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
ca70: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
ca80: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
ca90: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62  .busy ){.    Tab
caa0: 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63  le *pOld;.    Sc
cab0: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
cac0: 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  p->pSchema;.    
cad0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
cae0: 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
caf0: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
cb00: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e     sqlite3Strlen
cb30: 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 2c 70 29 3b  30(p->zName),p);
cb40: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
cb50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cb60: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
cb70: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
cb80: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
cb90: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
cba0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
cbb0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
cbc0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
cbd0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
cbe0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
cbf0: 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62  nTable++;.    db
cc00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
cc10: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
cc20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
cc30: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
cc40: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65  .    if( !p->pSe
cc50: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  lect ){.      co
cc60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
cc70: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
cc80: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
cc90: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20  en.z;.      int 
cca0: 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73  nName;.      ass
ccb0: 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26  ert( !pSelect &&
ccc0: 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29   pCons && pEnd )
ccd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e  ;.      if( pCon
cce0: 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  s->z==0 ){.     
ccf0: 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b     pCons = pEnd;
cd00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
cd10: 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f  Name = (int)((co
cd20: 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73  nst char *)pCons
cd30: 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->z - zName);.  
cd40: 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66      p->addColOff
cd50: 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74  set = 13 + sqlit
cd60: 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e  e3Utf8CharLen(zN
cd70: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
cd80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
cd90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cda0: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
cdb0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
cdc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
cdd0: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
cde0: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
cdf0: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
ce00: 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a  eView(.  Parse *
ce10: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54  pParse,     /* T
ce20: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
ce30: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
ce40: 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68  Begin,     /* Th
ce50: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
ce60: 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73  hat begins the s
ce70: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
ce80: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
ce90: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
cea0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
ceb0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
cec0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
ced0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
cee0: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
cef0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
cf00: 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
cf10: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
cf20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
cf30: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
cf40: 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
cf50: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
cf60: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
cf70: 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
cf80: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  iew */.  int noE
cf90: 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  rr          /* S
cfa0: 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65  uppress error me
cfb0: 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61  ssages if VIEW a
cfc0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
cfd0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
cfe0: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
cff0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
d000: 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
d010: 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
d020: 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44  *pName;.  int iD
d030: 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
d040: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
d050: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56    if( pParse->nV
d060: 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ar>0 ){.    sqli
d070: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d080: 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20  se, "parameters 
d090: 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
d0a0: 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20  in views");.    
d0b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
d0c0: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
d0d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
d0e0: 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  }.  sqlite3Start
d0f0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
d100: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
d110: 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72  Temp, 1, 0, noEr
d120: 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  r);.  p = pParse
d130: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
d140: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
d150: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
d160: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
d170: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
d180: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d190: 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  .  sqlite3TwoPar
d1a0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
d1b0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
d1c0: 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73  Name);.  iDb = s
d1d0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
d1e0: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
d1f0: 6d 61 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ma);.  if( sqlit
d200: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
d210: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
d220: 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20  iew", pName).   
d230: 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65   && sqlite3FixSe
d240: 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
d250: 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ect).  ){.    sq
d260: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d270: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
d280: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d290: 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
d2a0: 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  y of the entire 
d2b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d2c0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
d2d0: 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69  e view..  ** Thi
d2e0: 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c  s will force all
d2f0: 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
d300: 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64  z values to be d
d310: 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  ynamically.  ** 
d320: 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72  allocated rather
d330: 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74   than point to t
d340: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
d350: 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  - which means th
d360: 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c  at.  ** they wil
d370: 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20  l persist after 
d380: 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
d390: 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  te3_exec() call 
d3a0: 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
d3b0: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
d3c0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
d3d0: 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44  , pSelect, EXPRD
d3e0: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 73 71  UP_REDUCE);.  sq
d3f0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d400: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
d410: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
d420: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
d430: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
d440: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
d450: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65  {.    sqlite3Vie
d460: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
d470: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
d480: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
d490: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
d4a0: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
d4b0: 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
d4c0: 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
d4d0: 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
d4e0: 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
d4f0: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 41 4c 57  Token;.  if( ALW
d500: 41 59 53 28 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  AYS(sEnd.z[0]!=0
d510: 29 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  ) && sEnd.z[0]!=
d520: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
d530: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
d540: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
d550: 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e   n = (int)(sEnd.
d560: 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a  z - pBegin->z);.
d570: 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b    z = pBegin->z;
d580: 0a 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53  .  while( ALWAYS
d590: 28 6e 3e 30 29 20 26 26 20 73 71 6c 69 74 65 33  (n>0) && sqlite3
d5a0: 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20  Isspace(z[n-1]) 
d5b0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64  ){ n--; }.  sEnd
d5c0: 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20  .z = &z[n-1];.  
d5d0: 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f  sEnd.n = 1;..  /
d5e0: 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64  * Use sqlite3End
d5f0: 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74  Table() to add t
d600: 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53  he view to the S
d610: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
d620: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  le */.  sqlite3E
d630: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
d640: 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20  0, &sEnd, 0);.  
d650: 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
d660: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
d670: 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65  VIEW */..#if !de
d680: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d690: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
d6a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d6b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a  VIRTUALTABLE)./*
d6c0: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
d6d0: 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69  ructure pTable i
d6e0: 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e  s really a VIEW.
d6f0: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61    Fill in the na
d700: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  mes of.** the co
d710: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65  lumns of the vie
d720: 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20  w in the pTable 
d730: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
d740: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  rn the number.**
d750: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
d760: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
d770: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
d780: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
d790: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69  e->zErrMsg..*/.i
d7a0: 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  nt sqlite3ViewGe
d7b0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72  tColumnNames(Par
d7c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
d7d0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61  e *pTable){.  Ta
d7e0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
d7f0: 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20  /* A fake table 
d800: 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65  from which we ge
d810: 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  t the result set
d820: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
d830: 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  el;     /* Copy 
d840: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68  of the SELECT th
d850: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
d860: 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  e view */.  int 
d870: 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a  nErr = 0;     /*
d880: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
d890: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  s encountered */
d8a0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
d8b0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
d8c0: 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75  ily holds the nu
d8d0: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
d8e0: 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71  assigned */.  sq
d8f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d900: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
d910: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d920: 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  for malloc error
d930: 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 41 75  s */.  int (*xAu
d940: 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  th)(void*,int,co
d950: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
d960: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
d970: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  *,const char*);.
d980: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
d990: 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e );..#ifndef SQ
d9a0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d9b0: 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c  LTABLE.  if( sql
d9c0: 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e  ite3VtabCallConn
d9d0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ect(pParse, pTab
d9e0: 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  le) ){.    retur
d9f0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
da00: 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74    }.  if( IsVirt
da10: 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65  ual(pTable) ) re
da20: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  turn 0;.#endif..
da30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
da40: 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20  MIT_VIEW.  /* A 
da50: 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65  positive nCol me
da60: 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ans the columns 
da70: 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76  names for this v
da80: 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72  iew are.  ** alr
da90: 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f  eady known..  */
daa0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
dab0: 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30  Col>0 ) return 0
dac0: 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69  ;..  /* A negati
dad0: 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65  ve nCol is a spe
dae0: 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e  cial marker mean
daf0: 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20  ing that we are 
db00: 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74  currently.  ** t
db10: 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65  rying to compute
db20: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
db30: 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20  s.  If we enter 
db40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
db50: 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76  h.  ** a negativ
db60: 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73  e nCol, it means
db70: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65   two or more vie
db80: 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20  ws form a loop, 
db90: 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  like this:.  **.
dba0: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
dbb0: 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45  VIEW one AS SELE
dbc0: 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20  CT * FROM two;. 
dbd0: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
dbe0: 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43  IEW two AS SELEC
dbf0: 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20  T * FROM one;.  
dc00: 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
dc10: 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76  , the error abov
dc20: 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20  e is now caught 
dc30: 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e  prior to reachin
dc40: 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  g this point..  
dc50: 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f  ** But the follo
dc60: 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74 69  wing test is sti
dc70: 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20  ll important as 
dc80: 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a  it does come up.
dc90: 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c    ** in the foll
dca0: 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a  owing:.  ** .  *
dcb0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
dcc0: 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a  LE main.ex1(a);.
dcd0: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
dce0: 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41 53  TEMP VIEW ex1 AS
dcf0: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65   SELECT a FROM e
dd00: 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  x1;.  **     SEL
dd10: 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e  ECT * FROM temp.
dd20: 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ex1;.  */.  if( 
dd30: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29  pTable->nCol<0 )
dd40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
dd50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
dd60: 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c  iew %s is circul
dd70: 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70  arly defined", p
dd80: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
dd90: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
dda0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
ddb0: 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20  e->nCol>=0 );.. 
ddc0: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
ddd0: 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
dde0: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70   we need to comp
ddf0: 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ute the table na
de00: 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74  mes..  ** Note t
de10: 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
de20: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
de30: 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20  OfSelect() will 
de40: 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20  expand any.  ** 
de50: 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  "*" elements in 
de60: 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20  the results set 
de70: 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20  of the view and 
de80: 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73  will assign curs
de90: 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ors.  ** to the 
dea0: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
deb0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75  FROM clause.  Bu
dec0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  t we do not want
ded0: 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20   these changes. 
dee0: 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e   ** to be perman
def0: 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d  ent.  So the com
df00: 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65  putation is done
df10: 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68   on a copy of th
df20: 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74  e SELECT.  ** st
df30: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
df40: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
df50: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
df60: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b  able->pSelect );
df70: 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65  .  pSel = sqlite
df80: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
df90: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20  Table->pSelect, 
dfa0: 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29  0);.  if( pSel )
dfb0: 7b 0a 20 20 20 20 75 38 20 65 6e 61 62 6c 65 4c  {.    u8 enableL
dfc0: 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62 2d 3e 6c  ookaside = db->l
dfd0: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
dfe0: 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  d;.    n = pPars
dff0: 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
e000: 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
e010: 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
e020: 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
e030: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
e040: 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   -1;.    db->loo
e050: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
e060: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
e070: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
e080: 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68  ZATION.    xAuth
e090: 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20   = db->xAuth;.  
e0a0: 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b    db->xAuth = 0;
e0b0: 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
e0c0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
e0d0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
e0e0: 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78  pSel);.    db->x
e0f0: 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65  Auth = xAuth;.#e
e100: 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20  lse.    pSelTab 
e110: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
e120: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
e130: 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66  e, pSel);.#endif
e140: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
e150: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 65 6e  de.bEnabled = en
e160: 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20  ableLookaside;. 
e170: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
e180: 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65  = n;.    if( pSe
e190: 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73  lTab ){.      as
e1a0: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43  sert( pTable->aC
e1b0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ol==0 );.      p
e1c0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
e1d0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
e1e0: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
e1f0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
e200: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
e210: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
e220: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
e230: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
e240: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
e250: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
e260: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
e270: 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  >flags |= DB_Unr
e280: 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d  esetViews;.    }
e290: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
e2a0: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
e2b0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
e2c0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
e2d0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
e2e0: 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  el);.  } else {.
e2f0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
e300: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e310: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
e320: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
e330: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
e340: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e350: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
e360: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
e370: 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
e380: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e390: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
e3a0: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
e3b0: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
e3c0: 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
e3d0: 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
e3e0: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
e3f0: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
e400: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
e410: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
e420: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
e430: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
e440: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
e450: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
e460: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
e470: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
e480: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
e490: 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
e4a0: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
e4b0: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
e4c0: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
e4d0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
e4e0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
e4f0: 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  iteDeleteColumnN
e500: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a  ames(db, pTab);.
e510: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
e520: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62   = 0;.      pTab
e530: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
e540: 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
e550: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
e560: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
e570: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
e580: 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
e590: 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
e5a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e5b0: 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
e5c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
e5d0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
e5e0: 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
e5f0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
e600: 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
e610: 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
e620: 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
e630: 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
e640: 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
e650: 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
e660: 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
e670: 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
e680: 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
e690: 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20  * to iTo..**.** 
e6a0: 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54  Ticket #1728:  T
e6b0: 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
e6c0: 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74  might still cont
e6d0: 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ain information.
e6e0: 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64  ** on tables and
e6f0: 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  /or indices that
e700: 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73   are the process
e710: 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65   of being delete
e720: 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65  d..** If you are
e730: 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66   unlucky, one of
e740: 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69   those deleted i
e750: 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73  ndices or tables
e760: 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74   might.** have t
e770: 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65  he same rootpage
e780: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72   number as the r
e790: 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  eal table or ind
e7a0: 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65  ex that is.** be
e7b0: 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77  ing moved.  So w
e7c0: 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65  e cannot stop se
e7d0: 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68  arching after th
e7e0: 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a  e first match .*
e7f0: 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
e800: 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20  rst match might 
e810: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
e820: 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
e830: 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61  s.** or tables a
e840: 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65  nd not the table
e850: 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61  /index that is a
e860: 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f  ctually being mo
e870: 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20  ved..** We must 
e880: 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67  continue looping
e890: 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65   until all table
e8a0: 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69  s and indices wi
e8b0: 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d  th.** rootpage==
e8c0: 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20  iFrom have been 
e8d0: 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76  converted to hav
e8e0: 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20  e a rootpage of 
e8f0: 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  iTo.** in order 
e900: 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68  to be certain th
e910: 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69  at we got the ri
e920: 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e  ght one..*/.#ifn
e930: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e940: 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
e950: 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
e960: 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e  oved(Db *pDb, in
e970: 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
e980: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
e990: 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48  Elem;.  Hash *pH
e9a0: 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20  ash;..  pHash = 
e9b0: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
e9c0: 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
e9d0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
e9e0: 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
e9f0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
ea00: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
ea10: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
ea20: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
ea30: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
ea40: 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
ea50: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
ea60: 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
ea70: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
ea80: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
ea90: 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
eaa0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
eab0: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
eac0: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
ead0: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
eae0: 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
eaf0: 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
eb00: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
eb10: 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
eb20: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
eb30: 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
eb40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
eb50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
eb60: 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
eb70: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
eb80: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
eb90: 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
eba0: 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
ebb0: 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
ebc0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
ebd0: 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
ebe0: 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
ebf0: 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
ec00: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
ec10: 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
ec20: 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
ec30: 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
ec40: 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
ec50: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
ec60: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
ec70: 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
ec80: 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
ec90: 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
eca0: 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
ecb0: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
ecc0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
ecd0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
ece0: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
ecf0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
ed00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
ed10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73  AddOp3(v, OP_Des
ed20: 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31  troy, iTable, r1
ed30: 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
ed40: 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
ed50: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
ed60: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
ed70: 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f  M.  /* OP_Destro
ed80: 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69  y stores an in i
ed90: 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68  nteger r1. If th
eda0: 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  is integer.  ** 
edb0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
edc0: 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  n it is the root
edd0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
ede0: 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f  a table moved to
edf0: 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69  .  ** location i
ee00: 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  Table. The follo
ee10: 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69  wing code modifi
ee20: 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  es the sqlite_ma
ee30: 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
ee40: 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
ee50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
ee60: 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c  #NNN" in the SQL
ee70: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
ee80: 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
ee90: 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
eea0: 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69  .  ** is in regi
eeb0: 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67  ster NNN.  See g
eec0: 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73  rammar rules ass
eed0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
eee0: 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a   TK_REGISTER.  *
eef0: 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69  * token for addi
ef00: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
ef10: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  on..  */.  sqlit
ef20: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
ef30: 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44  arse, .     "UPD
ef40: 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f  ATE %Q.%s SET ro
ef50: 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20  otpage=%d WHERE 
ef60: 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65  #%d AND rootpage
ef70: 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72  =#%d",.     pPar
ef80: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
ef90: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
efa0: 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c  ABLE(iDb), iTabl
efb0: 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64  e, r1, r1);.#end
efc0: 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  if.  sqlite3Rele
efd0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
efe0: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
eff0: 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
f000: 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
f010: 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
f020: 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
f030: 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
f040: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
f050: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f060: 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
f070: 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
f080: 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
f090: 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
f0a0: 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
f0b0: 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
f0c0: 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
f0d0: 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
f0e0: 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
f0f0: 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
f100: 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
f110: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
f120: 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
f130: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
f140: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64  ble *pTab){.#ifd
f150: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f160: 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65  UTOVACUUM.  Inde
f170: 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
f180: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
f190: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
f1a0: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
f1b0: 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52  ema);.  destroyR
f1c0: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
f1d0: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pTab->tnum, iDb)
f1e0: 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  ;.  for(pIdx=pTa
f1f0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
f200: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
f210: 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  t){.    destroyR
f220: 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
f230: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
f240: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  ;.  }.#else.  /*
f250: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
f260: 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
f270: 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
f280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f290: 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
f2a0: 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
f2b0: 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
f2c0: 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
f2d0: 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
f2e0: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
f2f0: 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
f300: 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
f310: 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
f320: 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
f330: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
f340: 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
f350: 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
f360: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
f370: 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
f380: 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
f390: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
f3a0: 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
f3b0: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
f3c0: 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
f3d0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
f3e0: 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
f3f0: 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
f400: 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
f410: 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
f420: 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
f430: 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
f440: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
f450: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
f460: 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
f470: 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
f480: 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
f490: 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
f4a0: 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
f4b0: 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
f4c0: 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
f4d0: 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
f4e0: 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
f4f0: 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
f500: 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
f510: 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
f520: 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
f530: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
f540: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
f550: 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
f560: 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
f570: 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
f580: 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
f590: 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
f5a0: 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
f5b0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
f5c0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
f5d0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
f5e0: 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
f5f0: 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
f600: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
f610: 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
f620: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
f630: 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
f640: 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
f650: 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
f660: 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
f670: 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
f680: 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
f690: 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
f6a0: 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
f6b0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
f6c0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
f6d0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
f6e0: 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
f6f0: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
f700: 61 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f  a);.      destro
f710: 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
f720: 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29  , iLargest, iDb)
f730: 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79  ;.      iDestroy
f740: 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
f750: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f760: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
f770: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
f780: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
f790: 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
f7a0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
f7b0: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
f7c0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
f7d0: 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
f7e0: 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  id sqlite3DropTa
f7f0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
f800: 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
f810: 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69  e, int isView, i
f820: 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62  nt noErr){.  Tab
f830: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65  le *pTab;.  Vdbe
f840: 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
f850: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
f860: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
f870: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f880: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
f890: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f8a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
f8b0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
f8c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
f8d0: 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
f8e0: 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e  if( noErr ) db->
f8f0: 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20  suppressErr++;. 
f900: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
f910: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
f920: 65 2c 20 69 73 56 69 65 77 2c 20 0a 20 20 20 20  e, isView, .    
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61          pName->a
f950: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
f960: 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
f970: 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
f980: 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
f990: 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  --;..  if( pTab=
f9a0: 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
f9b0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f9c0: 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
f9d0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
f9e0: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
f9f0: 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
fa00: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
fa10: 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  >nDb );..  /* If
fa20: 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75   pTab is a virtu
fa30: 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56  al table, call V
fa40: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
fa50: 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20  s() to ensure.  
fa60: 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  ** it is initial
fa70: 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
fa80: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
fa90: 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47   && sqlite3ViewG
faa0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
fab0: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
fac0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
fad0: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66  p_table;.  }.#if
fae0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
faf0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
fb00: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
fb10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
fb20: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
fb30: 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63  ABLE(iDb);.    c
fb40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
fb50: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
fb60: 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
fb70: 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a  har *zArg2 = 0;.
fb80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
fb90: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
fba0: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
fbb0: 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
fbc0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
fbd0: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
fbe0: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
fbf0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
fc00: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
fc10: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
fc20: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
fc30: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
fc40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fc50: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
fc60: 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
fc70: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
fc80: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
fc90: 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
fca0: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
fcb0: 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  b) ){.      code
fcc0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
fcd0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72  TABLE;.      zAr
fce0: 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  g2 = sqlite3GetV
fcf0: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d  Table(db, pTab)-
fd00: 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65  >pMod->zName;.#e
fd10: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
fd20: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
fd30: 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
fd40: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
fd50: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
fd60: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
fd70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fd80: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
fd90: 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
fda0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
fdb0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
fdc0: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
fdd0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67  Tab->zName, zArg
fde0: 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  2, zDb) ){.     
fdf0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
fe00: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
fe10: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
fe20: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
fe30: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
fe40: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
fe50: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
fe60: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
fe70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
fe80: 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  f.  if( sqlite3S
fe90: 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
fea0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
feb0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  7)==0 ){.    sql
fec0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
fed0: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
fee0: 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
fef0: 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
ff00: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
ff10: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
ff20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ff30: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
ff40: 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
ff50: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
ff60: 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
ff70: 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
ff80: 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
ff90: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
ffa0: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
ffb0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
ffc0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ffd0: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
ffe0: 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
fff0: 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
10000 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
10010 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
10020 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
10030 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
10040 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
10050 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10060 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
10070 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
10080 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
10090 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
100a0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
100b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
100c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
100d0 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
100e0 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
100f0 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
10100 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
10110 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
10120 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
10130 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67  ( v ){.    Trigg
10140 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
10150 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
10160 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73  >aDb[iDb];.    s
10170 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
10180 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
10190 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
101a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
101b0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
101c0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
101d0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Tab) ){.      sq
101e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
101f0 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
10200 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
10210 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62  sqlite3FkDropTab
10220 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
10230 2c 20 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a  , pTab);..    /*
10240 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
10250 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
10260 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
10270 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
10280 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72  .    ** is gener
10290 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65  ated to remove e
102a0 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69  ntries from sqli
102b0 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72  te_master and/or
102c0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  .    ** sqlite_t
102d0 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
102e0 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
102f0 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71     pTrigger = sq
10300 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74  lite3TriggerList
10310 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
10320 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
10330 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ger ){.      ass
10340 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70  ert( pTrigger->p
10350 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
10360 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20  chema || .      
10370 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
10380 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
10390 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
103a0 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
103b0 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
103c0 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
103d0 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
103e0 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
103f0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
10400 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
10410 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 52 65  REMENT.    /* Re
10420 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
10430 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
10440 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
10450 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
10460 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
10470 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
10480 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
10490 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
104a0 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a 20 61 74  ropped.    ** at
104b0 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
104c0 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
104d0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
104e0 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ble needs to.   
104f0 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
10500 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
10510 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
10520 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
10530 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
10540 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
10550 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
10560 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
10570 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
10580 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
10590 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 2e  "DELETE FROM %s.
105a0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
105b0 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
105c0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
105d0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
105e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 23        );.    }.#
105f0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72  endif..    /* Dr
10600 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
10610 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
10620 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
10630 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
10640 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65     ** table. The
10650 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
10660 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
10670 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
10680 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20   deletes.    ** 
10690 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
106a0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
106b0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
106c0 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
106d0 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  ng.    ** droppe
106e0 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
106f0 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65  handled seperate
10700 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
10710 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20  gger can be.    
10720 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
10730 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
10740 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
10750 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
10760 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  r.    ** databas
10770 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
10780 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10790 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
107a0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
107b0 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
107c0 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
107d0 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
107e0 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
107f0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
10800 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  b), pTab->zName)
10810 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  ;..    /* Drop a
10820 6e 79 20 73 74 61 74 69 73 74 69 63 73 20 66 72  ny statistics fr
10830 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
10840 61 74 31 20 74 61 62 6c 65 2c 20 69 66 20 69 74  at1 table, if it
10850 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69   exists */.    i
10860 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
10870 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ble(db, "sqlite_
10880 73 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b  stat1", db->aDb[
10890 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  iDb].zName) ){. 
108a0 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
108b0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
108c0 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
108d0 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
108e0 74 61 74 31 20 57 48 45 52 45 20 74 62 6c 3d 25  tat1 WHERE tbl=%
108f0 51 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Q", pDb->zName, 
10900 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
10910 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
10920 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
10930 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10940 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  ){.      destroy
10950 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
10960 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ab);.    }..    
10970 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
10980 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
10990 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
109a0 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
109b0 66 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63  fy.    ** the sc
109c0 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20  hema cookie..   
109d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69   */.    if( IsVi
109e0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
109f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10a00 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65  AddOp4(v, OP_VDe
10a10 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30  stroy, iDb, 0, 0
10a20 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
10a30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10a40 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10a50 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
10a60 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
10a70 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
10a80 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
10a90 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
10aa0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69  ;.  }.  sqliteVi
10ab0 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
10ac0 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  Db);..exit_drop_
10ad0 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
10ae0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
10af0 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
10b00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10b10 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
10b20 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
10b30 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
10b40 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
10b50 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
10b60 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
10b70 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
10b80 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
10b90 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
10ba0 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
10bb0 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
10bc0 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
10bd0 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
10be0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
10bf0 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
10c00 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
10c10 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
10c20 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
10c30 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
10c40 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
10c50 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
10c60 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
10c70 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
10c80 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
10c90 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
10ca0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
10cb0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
10cc0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
10cd0 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
10ce0 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
10cf0 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
10d00 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
10d10 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
10d20 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
10d30 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
10d40 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
10d50 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
10d60 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
10d70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
10d80 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   field..**.** Th
10d90 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
10da0 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
10db0 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
10dc0 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
10dd0 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
10de0 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
10df0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
10e00 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
10e10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
10e20 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
10e30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10e40 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
10e50 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10e60 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
10e70 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
10e80 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
10e90 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
10ea0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
10eb0 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
10ec0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
10ed0 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
10ee0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
10ef0 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
10f00 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
10f10 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
10f20 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
10f30 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
10f40 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
10f50 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  . */.){.  sqlite
10f60 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
10f70 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
10f80 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
10f90 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
10fa0 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70  y = 0;.  FKey *p
10fb0 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20  NextTo;.  Table 
10fc0 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
10fd0 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
10fe0 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
10ff0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
11000 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
11010 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
11020 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  p==0 || IN_DECLA
11030 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66  RE_VTAB ) goto f
11040 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
11050 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
11060 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
11070 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45  ol-1;.    if( NE
11080 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f  VER(iCol<0) ) go
11090 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
110a0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
110b0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
110c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
110d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
110e0 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
110f0 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
11100 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
11110 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
11120 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
11130 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
11140 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
11150 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
11160 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
11170 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
11180 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
11190 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
111a0 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
111b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
111c0 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
111d0 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
111e0 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
111f0 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
11200 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
11210 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
11220 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
11230 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
11240 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
11250 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
11260 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
11270 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
11280 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
11290 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73  ey) + (nCol-1)*s
112a0 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
112b0 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
112c0 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
112d0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
112e0 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
112f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
11300 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
11310 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
11320 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
11330 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
11340 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
11350 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
11360 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
11370 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
11380 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46  fk_end;.  }.  pF
11390 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
113a0 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
113b0 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
113c0 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
113d0 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a  ey->aCol[nCol];.
113e0 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
113f0 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
11400 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
11410 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
11420 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
11430 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d  (z);.  z += pTo-
11440 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e  >n+1;.  pFKey->n
11450 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
11460 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
11470 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
11480 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
11490 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
114a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
114b0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
114c0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
114d0 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
114e0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
114f0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
11500 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
11510 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
11520 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
11530 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
11540 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
11550 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
11560 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
11570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11580 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
11590 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
115a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
115b0 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e  .          "unkn
115c0 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c  own column \"%s\
115d0 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
115e0 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20   definition", . 
115f0 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
11600 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
11610 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
11620 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
11630 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
11640 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
11650 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
11660 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
11670 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11680 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
11690 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
116a0 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
116b0 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
116c0 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
116d0 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
116e0 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
116f0 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
11700 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
11710 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
11720 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b   pFKey->aAction[
11730 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20  0] = (u8)(flags 
11740 26 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20  & 0xff);        
11750 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45      /* ON DELETE
11760 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b   action */.  pFK
11770 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d  ey->aAction[1] =
11780 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20   (u8)((flags >> 
11790 38 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20  8 ) & 0xff);    
117a0 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74  /* ON UPDATE act
117b0 69 6f 6e 20 2a 2f 0a 0a 20 20 70 4e 65 78 74 54  ion */..  pNextT
117c0 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69  o = (FKey *)sqli
117d0 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
117e0 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48  ->pSchema->fkeyH
117f0 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65  ash, .      pFKe
11800 79 2d 3e 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53  y->zTo, sqlite3S
11810 74 72 6c 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a  trlen30(pFKey->z
11820 54 6f 29 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b  To), (void *)pFK
11830 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  ey.  );.  if( pN
11840 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a  extTo==pFKey ){.
11850 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
11860 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f  iled = 1;.    go
11870 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
11880 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a   if( pNextTo ){.
11890 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78      assert( pNex
118a0 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20  tTo->pPrevTo==0 
118b0 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  );.    pFKey->pN
118c0 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b  extTo = pNextTo;
118d0 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50  .    pNextTo->pP
118e0 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20  revTo = pFKey;. 
118f0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
11900 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
11910 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
11920 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
11930 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
11940 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
11950 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
11960 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11970 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
11980 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
11990 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
119a0 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
119b0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
119c0 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
119d0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
119e0 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
119f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
11a00 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
11a10 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
11a20 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
11a30 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
11a40 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
11a50 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
11a60 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
11a70 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
11a80 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
11a90 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
11aa0 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
11ab0 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
11ac0 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
11ad0 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
11ae0 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
11af0 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
11b00 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
11b10 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
11b20 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
11b30 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
11b40 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
11b50 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
11b60 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
11b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
11b80 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
11b90 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
11ba0 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
11bb0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
11bc0 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
11bd0 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
11be0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
11bf0 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65    assert( isDefe
11c00 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66  rred==0 || isDef
11c10 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45  erred==1 ); /* E
11c20 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37  V: R-30323-21917
11c30 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44   */.  pFKey->isD
11c40 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73  eferred = (u8)is
11c50 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
11c60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
11c70 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
11c80 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
11c90 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
11ca0 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
11cb0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
11cc0 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
11cd0 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
11ce0 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
11cf0 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
11d00 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
11d10 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
11d20 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
11d30 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
11d40 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
11d50 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
11d60 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
11d70 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74  ted.  The regist
11d80 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20  er specified by 
11d90 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
11da0 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
11db0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
11dc0 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
11dd0 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
11de0 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
11df0 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
11e00 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
11e10 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
11e20 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
11e30 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
11e40 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
11e50 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
11e60 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
11e70 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
11e80 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
11e90 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
11ea0 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
11eb0 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
11ec0 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
11ed0 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
11ee0 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
11ef0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
11f00 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
11f10 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
11f20 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
11f30 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
11f40 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
11f50 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
11f60 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
11f70 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
11f80 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
11f90 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fb0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
11fc0 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
11fd0 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ff0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
12000 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
12010 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
12020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
12030 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
12040 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
12050 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
12060 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
12070 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
12080 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
12090 0a 20 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79  .  int regIdxKey
120a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
120b0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63    /* Registers c
120c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
120d0 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  dex key */.  int
120e0 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
120f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12100 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
12110 61 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78  assemblied index
12120 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
12130 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12140 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54  e->db;      /* T
12150 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
12160 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
12170 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
12180 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
12190 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
121a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
121b0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
121c0 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
121d0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
121e0 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e, SQLITE_REINDE
121f0 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  X, pIndex->zName
12200 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  , 0,.      db->a
12210 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20  Db[iDb].zName ) 
12220 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
12230 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
12240 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Require a write-
12250 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
12260 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69  e to perform thi
12270 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  s operation */. 
12280 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
12290 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
122a0 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54  Tab->tnum, 1, pT
122b0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76  ab->zName);..  v
122c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
122d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
122e0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
122f0 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
12300 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d  e>=0 ){.    tnum
12310 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a   = memRootPage;.
12320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
12330 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
12340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12350 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
12360 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b  ear, tnum, iDb);
12370 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71  .  }.  pKey = sq
12380 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
12390 6f 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  o(pParse, pIndex
123a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
123b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
123c0 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e  nWrite, iIdx, tn
123d0 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20  um, iDb, .      
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
123f0 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  har *)pKey, P4_K
12400 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
12410 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
12420 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ge>=0 ){.    sql
12430 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
12440 28 76 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71  (v, 1);.  }.  sq
12450 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
12460 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
12470 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
12480 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ead);.  addr1 = 
12490 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
124a0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
124b0 69 54 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52  iTab, 0);.  regR
124c0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
124d0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
124e0 29 3b 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d  );.  regIdxKey =
124f0 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
12500 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
12510 20 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72   pIndex, iTab, r
12520 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20  egRecord, 1);.  
12530 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
12540 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
12550 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 72 65      const int re
12560 67 52 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b  gRowid = regIdxK
12570 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  ey + pIndex->nCo
12580 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20  lumn;.    const 
12590 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33  int j2 = sqlite3
125a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
125b0 76 29 20 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64  v) + 2;.    void
125c0 20 2a 20 63 6f 6e 73 74 20 70 52 65 67 4b 65 79   * const pRegKey
125d0 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f   = SQLITE_INT_TO
125e0 5f 50 54 52 28 72 65 67 49 64 78 4b 65 79 29 3b  _PTR(regIdxKey);
125f0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 67  ..    /* The reg
12600 69 73 74 65 72 73 20 61 63 63 65 73 73 65 64 20  isters accessed 
12610 62 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71  by the OP_IsUniq
12620 75 65 20 6f 70 63 6f 64 65 20 77 65 72 65 20 61  ue opcode were a
12630 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
12640 75 73 69 6e 67 20 73 71 6c 69 74 65 33 47 65 74  using sqlite3Get
12650 54 65 6d 70 52 61 6e 67 65 28 29 20 69 6e 73 69  TempRange() insi
12660 64 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  de of the sqlite
12670 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
12680 79 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  y().    ** call 
12690 61 62 6f 76 65 2e 20 4a 75 73 74 20 62 65 66 6f  above. Just befo
126a0 72 65 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  re that function
126b0 20 77 61 73 20 66 72 65 65 64 20 74 68 65 79 20   was freed they 
126c0 77 65 72 65 20 72 65 6c 65 61 73 65 64 0a 20 20  were released.  
126d0 20 20 2a 2a 20 28 6d 61 64 65 20 61 76 61 69 6c    ** (made avail
126e0 61 62 6c 65 20 74 6f 20 74 68 65 20 63 6f 6d 70  able to the comp
126f0 69 6c 65 72 20 66 6f 72 20 72 65 75 73 65 29 20  iler for reuse) 
12700 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71  using .    ** sq
12710 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12720 52 61 6e 67 65 28 29 2e 20 53 6f 20 69 6e 20 73  Range(). So in s
12730 6f 6d 65 20 77 61 79 73 20 68 61 76 69 6e 67 20  ome ways having 
12740 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a  the OP_IsUnique.
12750 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73      ** opcode us
12760 65 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  e the values sto
12770 72 65 64 20 77 69 74 68 69 6e 20 73 65 65 6d 73  red within seems
12780 20 64 61 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65   dangerous. Howe
12790 76 65 72 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a  ver, since.    *
127a0 2a 20 77 65 20 63 61 6e 20 62 65 20 73 75 72 65  * we can be sure
127b0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 74   that no other t
127c0 65 6d 70 20 72 65 67 69 73 74 65 72 73 20 68 61  emp registers ha
127d0 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
127e0 64 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 73  d.    ** since s
127f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
12800 70 52 61 6e 67 65 28 29 20 77 61 73 20 63 61 6c  pRange() was cal
12810 6c 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  led, it is safe 
12820 74 6f 20 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f  to do so..    */
12830 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12840 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55  AddOp4(v, OP_IsU
12850 6e 69 71 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c  nique, iIdx, j2,
12860 20 72 65 67 52 6f 77 69 64 2c 20 70 52 65 67 4b   regRowid, pRegK
12870 65 79 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  ey, P4_INT32);. 
12880 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f     sqlite3HaltCo
12890 6e 73 74 72 61 69 6e 74 28 0a 20 20 20 20 20 20  nstraint(.      
128a0 20 20 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f    pParse, OE_Abo
128b0 72 74 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c  rt, "indexed col
128c0 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
128d0 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29  que", P4_STATIC)
128e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
128f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12900 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
12910 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
12920 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12930 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
12940 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
12950 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
12960 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
12970 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
12980 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12990 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
129a0 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74  ddr1+1);.  sqlit
129b0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
129c0 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69  , addr1);.  sqli
129d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
129e0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29   OP_Close, iTab)
129f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12a00 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
12a10 65 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a  e, iIdx);.}../*.
12a20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
12a30 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
12a40 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e   table.  pName1.
12a50 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61  pName2 is the na
12a60 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
12a70 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74  .** and pTblList
12a80 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
12a90 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
12aa0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
12ab0 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
12ac0 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
12ad0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
12ae0 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
12af0 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
12b00 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
12b10 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
12b20 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
12b30 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
12b40 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
12b50 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
12b60 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
12b70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
12b80 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
12b90 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
12ba0 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
12bb0 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
12bc0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
12bd0 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
12be0 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
12bf0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
12c00 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
12c10 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
12c20 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
12c30 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
12c40 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
12c50 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
12c60 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
12c70 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
12c80 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
12c90 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  n.  .**.** If th
12ca0 65 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  e index is creat
12cb0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
12cc0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
12cd0 72 20 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64  r to the new Ind
12ce0 65 78 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ex.** structure.
12cf0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
12d00 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
12d10 72 79 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20  ryKey() to mark 
12d20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20  the index.** as 
12d30 74 68 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61  the tables prima
12d40 72 79 20 6b 65 79 20 28 49 6e 64 65 78 2e 61 75  ry key (Index.au
12d50 74 6f 49 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a  toIndex==2)..*/.
12d60 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 43 72  Index *sqlite3Cr
12d70 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
12d80 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12d90 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
12da0 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
12db0 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
12dc0 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46  pName1,     /* F
12dd0 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64  irst part of ind
12de0 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
12df0 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
12e00 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
12e10 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69  Second part of i
12e20 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
12e30 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
12e40 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f  ist *pTblName, /
12e50 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
12e60 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
12e70 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
12e80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
12e90 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
12ea0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
12eb0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
12ec0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
12ed0 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
12ee0 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
12ef0 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
12f00 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
12f10 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  t,     /* The CR
12f20 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
12f30 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74  begins this stat
12f40 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
12f50 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a   *pEnd,       /*
12f60 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c   The ")" that cl
12f70 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20  oses the CREATE 
12f80 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
12f90 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
12fa0 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20  er,     /* Sort 
12fb0 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79  order of primary
12fc0 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d   key when pList=
12fd0 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69  =NULL */.  int i
12fe0 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a  fNotExist     /*
12ff0 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69   Omit error if i
13000 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
13010 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  sts */.){.  Inde
13020 78 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  x *pRet = 0;    
13030 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72   /* Pointer to r
13040 65 74 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65  eturn */.  Table
13050 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
13060 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
13070 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
13080 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
13090 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
130a0 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
130b0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
130c0 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
130d0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
130e0 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
130f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13100 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
13110 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
13120 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c  , j;.  Token nul
13130 6c 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  lId;        /* F
13140 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
13150 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
13160 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
13170 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
13180 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
13190 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
131a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
131b0 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
131c0 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
131d0 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
131e0 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
131f0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
13200 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
13210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13220 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
13230 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
13240 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
13250 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
13260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13270 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
13280 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
13290 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
132a0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
132b0 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
132c0 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
132d0 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
132e0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
132f0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
13300 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
13310 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
13320 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t */.  int nCol;
13330 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
13340 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  0;.  char *zExtr
13350 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  a;..  assert( pS
13360 74 61 72 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 21  tart==0 || pEnd!
13370 3d 30 20 29 3b 20 2f 2a 20 70 45 6e 64 20 6d 75  =0 ); /* pEnd mu
13380 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  st be non-NULL i
13390 66 20 70 53 74 61 72 74 20 69 73 20 2a 2f 0a 20  f pStart is */. 
133a0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
133b0 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 20 20  >nErr==0 );     
133c0 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
133d0 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f   with prior erro
133e0 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  rs */.  if( db->
133f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
13400 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
13410 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
13420 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13430 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f   }.  if( SQLITE_
13440 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
13450 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
13460 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13470 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13480 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
13490 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
134a0 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
134b0 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
134c0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
134d0 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
134e0 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
134f0 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
13500 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
13510 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
13520 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
13530 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
13540 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
13550 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
13560 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
13570 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
13580 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
13590 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
135a0 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
135b0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
135c0 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
135d0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
135e0 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
135f0 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
13600 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13610 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66  _index;..#ifndef
13620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
13630 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  PDB.    /* If th
13640 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
13650 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
13660 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74  eck if the the t
13670 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
13680 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
13690 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
136a0 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f  base to 1. Do no
136b0 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  t do this.    **
136c0 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67   if initialising
136d0 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
136e0 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ma..    */.    i
136f0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
13700 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  y ){.      pTab 
13710 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
13720 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
13730 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TblName);.      
13740 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30  if( pName2->n==0
13750 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
13760 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
13770 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
13780 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31  .        iDb = 1
13790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
137a0 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
137b0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
137c0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
137d0 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
137e0 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
137f0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
13800 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
13810 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
13820 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72   Because the par
13830 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70  ser constructs p
13840 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73  TblName from a s
13850 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ingle identifier
13860 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  ,.      ** sqlit
13870 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e  e3FixSrcList can
13880 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a   never fail. */.
13890 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
138a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
138b0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
138c0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
138d0 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
138e0 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
138f0 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  TblName->a[0].zD
13900 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66  atabase);.    if
13910 28 20 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d  ( !pTab || db->m
13920 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
13930 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13940 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
13950 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
13960 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
13970 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65  chema );.  }else
13980 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
13990 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
139a0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
139b0 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
139c0 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
139d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
139e0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
139f0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
13a00 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
13a10 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
13a20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
13a30 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
13a40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13a50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
13a60 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
13a70 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
13a80 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
13a90 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
13aa0 6d 65 6d 63 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  memcmp(&pTab->zN
13ab0 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62  ame[7],"altertab
13ac0 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20  _",9)!=0 ){.    
13ad0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13ae0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
13af0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
13b00 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
13b10 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
13b20 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13b30 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
13b40 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
13b50 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
13b60 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
13b70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13b80 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
13b90 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
13ba0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13bb0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
13bc0 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
13bd0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13be0 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
13bf0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
13c00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13c10 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74  sg(pParse, "virt
13c20 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
13c30 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
13c40 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13c50 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13c60 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
13c70 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
13c80 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
13c90 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
13ca0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
13cb0 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
13cc0 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
13cd0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
13ce0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
13cf0 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
13d00 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
13d10 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
13d20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
13d30 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
13d40 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
13d50 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
13d60 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
13d70 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
13d80 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
13d90 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
13da0 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
13db0 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
13dc0 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
13dd0 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
13de0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
13df0 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
13e00 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
13e10 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
13e20 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
13e30 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
13e40 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
13e50 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
13e60 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
13e70 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
13e80 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
13e90 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
13ea0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
13eb0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
13ec0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
13ed0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
13ee0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13ef0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  dex;.    if( SQL
13f00 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
13f10 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
13f20 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
13f30 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13f40 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13f50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
13f60 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
13f70 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
13f80 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
13f90 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
13fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13fb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
13fc0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
13fd0 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
13fe0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
13ff0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
14000 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
14010 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
14020 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
14030 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62  x(db, zName, pDb
14040 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
14050 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45       if( !ifNotE
14060 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  xist ){.        
14070 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14080 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
14090 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
140a0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
140b0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78   }.      goto ex
140c0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
140d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
140e0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
140f0 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
14100 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
14110 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
14120 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
14130 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
14140 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
14150 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
14160 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
14170 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a  _%s_%d", pTab->z
14180 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66  Name, n);.    if
14190 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
141a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
141b0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
141c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
141d0 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
141e0 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
141f0 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
14200 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14210 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
14220 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
14230 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e  r *zDb = pDb->zN
14240 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
14250 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
14260 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
14270 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
14280 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20  E(iDb), 0, zDb) 
14290 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
142a0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
142b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
142c0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
142d0 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  EX;.    if( !OMI
142e0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
142f0 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  =1 ) i = SQLITE_
14300 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
14310 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
14320 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14330 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
14340 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
14350 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
14360 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14370 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
14380 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74  f..  /* If pList
14390 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ==0, it means th
143a0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
143b0 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20  alled to make a 
143c0 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79  primary.  ** key
143d0 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74   out of the last
143e0 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
143f0 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
14400 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
14410 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
14420 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
14430 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
14440 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14450 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20  ){.    nullId.z 
14460 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  = pTab->aCol[pTa
14470 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65  b->nCol-1].zName
14480 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d  ;.    nullId.n =
14490 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
144a0 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a  ((char*)nullId.z
144b0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  );.    pList = s
144c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
144d0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
144e0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  0);.    if( pLis
144f0 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
14500 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14510 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
14520 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
14530 2c 20 70 4c 69 73 74 2c 20 26 6e 75 6c 6c 49 64  , pList, &nullId
14540 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d  , 0);.    pList-
14550 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
14560 3d 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b  = (u8)sortOrder;
14570 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
14580 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62  e out how many b
14590 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72  ytes of space ar
145a0 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  e required to st
145b0 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20  ore explicitly. 
145c0 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f   ** specified co
145d0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
145e0 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66   names..  */.  f
145f0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
14600 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14610 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
14620 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
14630 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
14640 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
14650 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72  q *pColl = pExpr
14660 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f  ->pColl;.      /
14670 2a 20 45 69 74 68 65 72 20 70 43 6f 6c 6c 21 3d  * Either pColl!=
14680 30 20 6f 72 20 74 68 65 72 65 20 77 61 73 20 61  0 or there was a
14690 6e 20 4f 4f 4d 20 66 61 69 6c 75 72 65 2e 20 20  n OOM failure.  
146a0 42 75 74 20 69 66 20 61 6e 20 4f 4f 4d 0a 20 20  But if an OOM.  
146b0 20 20 20 20 2a 2a 20 66 61 69 6c 75 72 65 20 77      ** failure w
146c0 65 20 68 61 76 65 20 71 75 69 74 20 62 65 66 6f  e have quit befo
146d0 72 65 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  re reaching this
146e0 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20   point. */.     
146f0 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 6f 6c   if( ALWAYS(pCol
14700 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45  l) ){.        nE
14710 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c  xtra += (1 + sql
14720 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f  ite3Strlen30(pCo
14730 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ll->zName));.   
14740 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
14750 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
14760 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
14770 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
14780 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
14790 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
147a0 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d  .  nCol = pList-
147b0 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78  >nExpr;.  pIndex
147c0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
147d0 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20  ocZero(db, .    
147e0 20 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20    sizeof(Index) 
147f0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
14800 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
14810 65 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  e  */.      size
14820 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20  of(int)*nCol +  
14830 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14840 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
14850 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
14860 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20  )*(nCol+1) +    
14870 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
14880 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  wEst   */.      
14890 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e  sizeof(char *)*n
148a0 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20  Col +        /* 
148b0 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
148c0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
148d0 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  (u8)*nCol +     
148e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
148f0 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
14900 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20      nName + 1 + 
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14920 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20   /* Index.zName 
14930 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45       */.      nE
14940 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20  xtra            
14950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
14960 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
14970 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20   names */.  );. 
14980 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
14990 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
149a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
149b0 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  dex;.  }.  pInde
149c0 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
149d0 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d 29  r**)(&pIndex[1])
149e0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
149f0 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26  lumn = (int *)(&
14a00 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e  pIndex->azColl[n
14a10 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
14a20 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 75 6e 73  >aiRowEst = (uns
14a30 69 67 6e 65 64 20 2a 29 28 26 70 49 6e 64 65 78  igned *)(&pIndex
14a40 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d  ->aiColumn[nCol]
14a50 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  );.  pIndex->aSo
14a60 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29  rtOrder = (u8 *)
14a70 28 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  (&pIndex->aiRowE
14a80 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70  st[nCol+1]);.  p
14a90 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
14aa0 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
14ab0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c  >aSortOrder[nCol
14ac0 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28  ]);.  zExtra = (
14ad0 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
14ae0 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29  >zName[nName+1])
14af0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
14b00 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
14b10 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
14b20 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
14b30 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
14b40 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
14b50 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
14b60 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
14b70 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
14b80 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 28 75 38  >autoIndex = (u8
14b90 29 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70  )(pName==0);.  p
14ba0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d  Index->pSchema =
14bb0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
14bc0 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65  chema;..  /* Che
14bd0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
14be0 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53  should honor DES
14bf0 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e  C requests on in
14c00 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  dex columns.  */
14c10 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68  .  if( pDb->pSch
14c20 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
14c30 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f  >=4 ){.    sortO
14c40 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20  rderMask = -1;  
14c50 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a   /* Honor DESC *
14c60 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
14c70 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30  ortOrderMask = 0
14c80 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44  ;    /* Ignore D
14c90 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ESC */.  }..  /*
14ca0 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20   Scan the names 
14cb0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  of the columns o
14cc0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
14cd0 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20  e indexed and.  
14ce0 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75  ** load the colu
14cf0 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20  mn indices into 
14d00 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74  the Index struct
14d10 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ure.  Report an 
14d20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e  error.  ** if an
14d30 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  y column is not 
14d40 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  found..  **.  **
14d50 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65   TODO:  Add a te
14d60 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  st to make sure 
14d70 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f  that the same co
14d80 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65  lumn is not name
14d90 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  d.  ** more than
14da0 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65   once within the
14db0 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e   same index.  On
14dc0 6c 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73  ly the first ins
14dd0 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68  tance of.  ** th
14de0 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76  e column will ev
14df0 65 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68  er be used by th
14e00 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f  e optimizer.  No
14e10 74 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68  te that using th
14e20 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75  e.  ** same colu
14e30 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  mn more than onc
14e40 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65  e cannot be an e
14e50 72 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61  rror because tha
14e60 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72  t would .  ** br
14e70 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f  eak backwards co
14e80 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74  mpatibility - it
14e90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77   needs to be a w
14ea0 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  arning..  */.  f
14eb0 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65  or(i=0, pListIte
14ec0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
14ed0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
14ee0 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20   pListItem++){. 
14ef0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14f00 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49  ColName = pListI
14f10 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
14f20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b  Column *pTabCol;
14f30 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74  .    int request
14f40 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  edSortOrder;.   
14f50 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f70 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
14f80 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20  uence name */.. 
14f90 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62     for(j=0, pTab
14fa0 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
14fb0 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
14fc0 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20  +, pTabCol++){. 
14fd0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
14fe0 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65  StrICmp(zColName
14ff0 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65  , pTabCol->zName
15000 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
15010 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
15020 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
15030 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15040 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
15050 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %s has no colu
15060 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
15070 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
15080 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  e, zColName);.  
15090 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
150a0 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
150b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
150c0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
150d0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
150e0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
150f0 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69    /* Justificati
15100 6f 6e 20 6f 66 20 74 68 65 20 41 4c 57 41 59 53  on of the ALWAYS
15110 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70  (pListItem->pExp
15120 72 2d 3e 70 43 6f 6c 6c 29 3a 20 20 42 65 63 61  r->pColl):  Beca
15130 75 73 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  use of.    ** th
15140 65 20 77 61 79 20 74 68 65 20 22 69 64 78 6c 69  e way the "idxli
15150 73 74 22 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  st" non-terminal
15160 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64 20   is constructed 
15170 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 0a 20  by the parser,. 
15180 20 20 20 2a 2a 20 69 66 20 70 4c 69 73 74 49 74     ** if pListIt
15190 65 6d 2d 3e 70 45 78 70 72 20 69 73 20 6e 6f 74  em->pExpr is not
151a0 20 6e 75 6c 6c 20 74 68 65 6e 20 65 69 74 68 65   null then eithe
151b0 72 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  r pListItem->pEx
151c0 70 72 2d 3e 70 43 6f 6c 6c 0a 20 20 20 20 2a 2a  pr->pColl.    **
151d0 20 6d 75 73 74 20 65 78 69 73 74 20 6f 72 20 65   must exist or e
151e0 6c 73 65 20 74 68 65 72 65 20 6d 75 73 74 20 68  lse there must h
151f0 61 76 65 20 62 65 65 6e 20 61 6e 20 4f 4f 4d 20  ave been an OOM 
15200 65 72 72 6f 72 2e 20 20 42 75 74 20 69 66 20 74  error.  But if t
15210 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  here.    ** was 
15220 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2c 20 77 65  an OOM error, we
15230 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 72 65 61   would never rea
15240 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a  ch this point. *
15250 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  /.    if( pListI
15260 74 65 6d 2d 3e 70 45 78 70 72 20 26 26 20 41 4c  tem->pExpr && AL
15270 57 41 59 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e  WAYS(pListItem->
15280 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 20 29 7b  pExpr->pColl) ){
15290 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c  .      int nColl
152a0 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
152b0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
152c0 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  ->pColl->zName;.
152d0 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71        nColl = sq
152e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
152f0 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  oll) + 1;.      
15300 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
15310 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d  nColl );.      m
15320 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43  emcpy(zExtra, zC
15330 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20  oll, nColl);.   
15340 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72     zColl = zExtr
15350 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  a;.      zExtra 
15360 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  += nColl;.      
15370 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b  nExtra -= nColl;
15380 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15390 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e    zColl = pTab->
153a0 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
153b0 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20       if( !zColl 
153c0 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c  ){.        zColl
153d0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
153e0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ->zName;.      }
153f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
15400 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
15410 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
15420 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
15430 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67  Coll) ){.      g
15440 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
15450 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
15460 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
15470 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
15480 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
15490 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
154a0 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
154b0 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
154c0 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
154d0 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65  r[i] = (u8)reque
154e0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
154f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61   }.  sqlite3Defa
15500 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
15510 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
15520 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
15530 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
15540 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
15550 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
15560 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
15570 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
15580 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
15590 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
155a0 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
155b0 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
155c0 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
155d0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
155e0 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
155f0 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
15600 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
15610 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
15620 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
15630 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
15640 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
15650 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
15660 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
15670 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
15680 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
15690 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
156a0 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
156b0 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
156c0 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
156d0 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
156e0 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
156f0 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
15700 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
15710 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
15720 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
15730 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
15740 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
15750 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
15760 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
15770 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55   **.    ** Two U
15780 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
15790 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73   KEY constraints
157a0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
157b0 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a  equivalent.    *
157c0 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70  * (and thus supp
157d0 72 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f  ressing the seco
157e0 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20  nd one) even if 
157f0 74 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72  they have differ
15800 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20  ent.    ** sort 
15810 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20  orders..    **. 
15820 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61     ** If there a
15830 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c  re different col
15840 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
15850 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   or if the colum
15860 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ns of.    ** the
15870 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75   constraint occu
15880 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f  r in different o
15890 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  rders, then the 
158a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a  constraints are.
158b0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
158c0 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62  d distinct and b
158d0 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65  oth result in se
158e0 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a  parate indices..
158f0 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
15900 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
15910 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
15920 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
15930 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
15940 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
15950 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45  ssert( pIdx->onE
15960 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
15970 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15980 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  Idx->autoIndex )
15990 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
159a0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
159b0 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20  =OE_None );..   
159c0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
159d0 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43  lumn!=pIndex->nC
159e0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
159f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
15a00 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   k<pIdx->nColumn
15a10 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
15a20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a  const char *z1;.
15a30 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15a40 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  ar *z2;.        
15a50 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
15a60 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
15a70 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
15a80 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ak;.        z1 =
15a90 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
15aa0 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70  ;.        z2 = p
15ab0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
15ac0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 31  ;.        if( z1
15ad0 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53  !=z2 && sqlite3S
15ae0 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29  trICmp(z1, z2) )
15af0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
15b00 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
15b10 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
15b20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
15b30 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d  onError!=pIndex-
15b40 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >onError ){.    
15b50 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
15b60 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73  nstraint creates
15b70 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
15b80 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  as a previous.  
15b90 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
15ba0 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20  raint specified 
15bb0 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
15bc0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
15bd0 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
15be0 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68     ** However th
15bf0 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  e ON CONFLICT cl
15c00 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72  auses are differ
15c10 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69  ent. If both thi
15c20 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
15c30 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
15c40 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69  he previous equi
15c50 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  valent constrain
15c60 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a  t have explicit.
15c70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20            ** ON 
15c80 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
15c90 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
15ca0 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  r. Otherwise, us
15cb0 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
15cc0 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ** explicitly sp
15cd0 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75  ecified behaviou
15ce0 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
15cf0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
15d00 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
15d10 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
15d20 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
15d30 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
15d40 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
15d50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
15d60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
15d90 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
15da0 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
15db0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15dc0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
15dd0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
15de0 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
15df0 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
15e00 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
15e10 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
15e20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15e30 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
15e40 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
15e50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
15e60 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
15e70 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
15e80 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
15e90 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
15ea0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
15eb0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
15ec0 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  . .  */.  if( db
15ed0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
15ee0 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
15ef0 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
15f00 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
15f10 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
15f20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
15f40 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69  dex->zName, sqli
15f50 74 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64  te3Strlen30(pInd
15f60 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  ex->zName),.    
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f80 20 20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a 20        pIndex);. 
15f90 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
15fa0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
15fb0 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
15fc0 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
15fd0 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  ed */.      db->
15fe0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
15ff0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
16000 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
16010 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
16020 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
16030 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
16040 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
16050 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
16060 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
16070 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d  t.newTnum;.    }
16080 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16090 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
160a0 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
160b0 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
160c0 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
160d0 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
160e0 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
160f0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
16100 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
16110 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
16120 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
16130 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
16140 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d   **.  ** The db-
16150 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
16160 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
16170 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
16180 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
16190 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e  command.  db->in
161a0 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65  it.busy is 1 whe
161b0 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
161c0 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
161d0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
161e0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
161f0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
16200 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
16210 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
16220 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
16230 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
16240 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
16250 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
16260 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
16270 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
16280 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
16290 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
162a0 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
162b0 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  as a primary key
162c0 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
162d0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20  constraint of a 
162e0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
162f0 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
16300 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
16310 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
16320 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
16330 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
16340 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
16350 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
16360 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
16370 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 20 2f 2a 20    */.  else{ /* 
16380 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
16390 79 3d 3d 30 20 29 20 2a 2f 0a 20 20 20 20 56 64  y==0 ) */.    Vd
163a0 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
163b0 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
163c0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
163d0 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20  >nMem;..    v = 
163e0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
163f0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
16400 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
16410 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
16420 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
16430 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
16440 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
16450 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
16460 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
16470 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
16480 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16490 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65  AddOp2(v, OP_Cre
164a0 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69  ateIndex, iDb, i
164b0 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  Mem);..    /* Ga
164c0 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
164d0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
164e0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
164f0 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
16500 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
16510 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
16520 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
16530 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
16540 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 );.      /* A
16550 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
16560 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
16570 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
16580 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
16590 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
165a0 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
165b0 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
165c0 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d          onError=
165d0 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20  =OE_None ? "" : 
165e0 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20  " UNIQUE",.     
165f0 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61     pEnd->z - pNa
16600 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20  me->z + 1,.     
16610 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20     pName->z);.  
16620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
16630 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
16640 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
16650 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
16660 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
16670 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a  nt */.      /* z
16680 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
16690 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20  rintf(""); */.  
166a0 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
166b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
166c0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
166d0 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
166e0 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  his index.    */
166f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
16700 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
16710 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
16720 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
16730 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
16740 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20  ,#%d,%Q);",.    
16750 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
16760 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
16770 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
16780 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
16790 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
167a0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69  zName,.        i
167b0 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74  Mem,.        zSt
167c0 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
167d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
167e0 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
167f0 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
16800 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
16810 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
16820 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
16830 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
16840 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
16850 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
16860 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
16870 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
16880 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
16890 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
168a0 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
168b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
168c0 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
168d0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
168e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
168f0 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
16900 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20  a, iDb, 0, 0,.  
16910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
16920 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d  rintf(db, "name=
16930 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69  '%q' AND type='i
16940 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ndex'", pIndex->
16950 7a 4e 61 6d 65 29 2c 20 0a 20 20 20 20 20 20 20  zName), .       
16960 20 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20    P4_DYNAMIC);. 
16970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16980 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70  AddOp1(v, OP_Exp
16990 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ire, 0);.    }. 
169a0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
169b0 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
169c0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
169d0 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
169e0 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
169f0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
16a00 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
16a10 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
16a20 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
16a30 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
16a40 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
16a50 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
16a60 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b  constraint check
16a70 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
16a80 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65   (in sqlite3Gene
16a90 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
16aa0 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20  ecks()) as part 
16ab0 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61  of.  ** UPDATE a
16ac0 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  nd INSERT statem
16ad0 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  ents.  .  */.  i
16ae0 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
16af0 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   || pTblName==0 
16b00 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  ){.    if( onErr
16b10 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or!=OE_Replace |
16b20 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d  | pTab->pIndex==
16b30 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54  0.         || pT
16b40 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ab->pIndex->onEr
16b50 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  ror==OE_Replace)
16b60 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
16b70 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49  pNext = pTab->pI
16b80 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62  ndex;.      pTab
16b90 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
16ba0 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  x;.    }else{.  
16bb0 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
16bc0 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
16bd0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
16be0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20  Other->pNext && 
16bf0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f  pOther->pNext->o
16c00 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
16c10 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  ce ){.        pO
16c20 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70  ther = pOther->p
16c30 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
16c40 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
16c50 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  t = pOther->pNex
16c60 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d  t;.      pOther-
16c70 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b  >pNext = pIndex;
16c80 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74 20  .    }.    pRet 
16c90 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49  = pIndex;.    pI
16ca0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
16cb0 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
16cc0 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
16cd0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
16ce0 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
16cf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
16d00 72 65 65 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  ree(db, pIndex->
16d10 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 73 71  zColAff);.    sq
16d20 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16d30 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
16d40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
16d50 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
16d60 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
16d70 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c  tDelete(db, pTbl
16d80 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
16d90 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
16da0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
16db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20  ;.}../*.** Fill 
16dc0 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45  the Index.aiRowE
16dd0 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20  st[] array with 
16de0 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74  default informat
16df0 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f  ion - informatio
16e00 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20  n.** to be used 
16e10 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74  when we have not
16e20 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45   run the ANALYZE
16e30 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
16e40 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73  aiRowEst[0] is s
16e50 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69  uppose to contai
16e60 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16e70 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
16e80 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20  index..** Since 
16e90 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20  we do not know, 
16ea0 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e  guess 1 million.
16eb0 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73    aiRowEst[1] is
16ec0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
16ed0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
16ee0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
16ef0 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  le that match an
16f00 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  y particular val
16f10 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  ue of the.** fir
16f20 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
16f30 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73   index.  aiRowEs
16f40 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[2] is an estim
16f50 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
16f60 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61  r.** of rows tha
16f70 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
16f80 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74  icular combiniat
16f90 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  ion of the first
16fa0 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66   2 columns.** of
16fb0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64   the index.  And
16fc0 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d   so forth.  It m
16fd0 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68  ust always be th
16fe0 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a  e case that.*.**
16ff0 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
17000 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74  Est[N]<=aiRowEst
17010 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20  [N-1].**        
17020 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d     aiRowEst[N]>=
17030 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72  1.**.** Apart fr
17040 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65  om that, we have
17050 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e   little to go on
17060 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69   besides intuiti
17070 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20  on as to.** how 
17080 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c  aiRowEst[] shoul
17090 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  d be initialized
170a0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67  .  The numbers g
170b0 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a  enerated here.**
170c0 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79   are based on ty
170d0 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75  pical values fou
170e0 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64  nd in actual ind
170f0 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ices..*/.void sq
17100 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
17110 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  st(Index *pIdx){
17120 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d  .  unsigned *a =
17130 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b   pIdx->aiRowEst;
17140 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
17150 67 6e 65 64 20 6e 3b 0a 20 20 61 73 73 65 72 74  gned n;.  assert
17160 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d  ( a!=0 );.  a[0]
17170 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
17180 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 69 66 28 20  >nRowEst;.  if( 
17190 61 5b 30 5d 3c 31 30 20 29 20 61 5b 30 5d 20 3d  a[0]<10 ) a[0] =
171a0 20 31 30 3b 0a 20 20 6e 20 3d 20 31 30 3b 0a 20   10;.  n = 10;. 
171b0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 49 64   for(i=1; i<=pId
171c0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
171d0 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 6e 3b 0a  {.    a[i] = n;.
171e0 20 20 20 20 69 66 28 20 6e 3e 35 20 29 20 6e 2d      if( n>5 ) n-
171f0 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  -;.  }.  if( pId
17200 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
17210 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64  one ){.    a[pId
17220 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b  x->nColumn] = 1;
17230 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
17240 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
17250 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
17260 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
17270 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
17280 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
17290 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
172a0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
172b0 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
172c0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
172d0 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
172e0 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64  ifExists){.  Ind
172f0 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
17300 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
17310 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
17320 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
17330 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
17340 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a  >nErr==0 );   /*
17350 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
17360 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
17370 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
17380 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
17390 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
173a0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
173b0 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
173c0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
173d0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
173e0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
173f0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
17400 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
17410 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
17420 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
17430 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
17440 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
17450 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
17460 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
17470 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
17480 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
17490 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
174a0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
174b0 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
174c0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  0);.    }.    pP
174d0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
174e0 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
174f0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
17500 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
17510 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
17520 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17530 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
17540 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
17550 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
17560 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
17570 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
17580 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
17590 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
175a0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
175b0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
175c0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
175d0 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
175e0 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ema);.#ifndef SQ
175f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
17600 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
17610 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
17620 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
17630 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
17640 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
17650 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
17660 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
17670 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
17680 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
17690 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
176a0 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  b);.    if( sqli
176b0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
176c0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
176d0 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62  TE, zTab, 0, zDb
176e0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
176f0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
17700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
17710 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
17720 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49  Db ) code = SQLI
17730 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44  TE_DROP_TEMP_IND
17740 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
17750 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
17760 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65  rse, code, pInde
17770 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  x->zName, pTab->
17780 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
17790 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
177a0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
177b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
177c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
177d0 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  to remove the in
177e0 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65  dex and from the
177f0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f   master table */
17800 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
17810 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
17820 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
17830 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
17840 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
17850 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
17860 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
17870 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
17880 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
17890 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  %s WHERE name=%Q
178a0 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
178b0 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  '",.       db->a
178c0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
178d0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
178e0 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ,.       pIndex-
178f0 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
17900 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
17910 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69  dTable(db, "sqli
17920 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61  te_stat1", db->a
17930 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29  Db[iDb].zName) )
17940 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
17950 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
17960 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
17970 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
17980 65 5f 73 74 61 74 31 20 57 48 45 52 45 20 69 64  e_stat1 WHERE id
17990 78 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 64  x=%Q",.        d
179a0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
179b0 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
179c0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
179d0 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
179e0 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
179f0 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f  iDb);.    destro
17a00 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
17a10 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
17a20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
17a30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17a40 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62  P_DropIndex, iDb
17a50 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  , 0, 0, pIndex->
17a60 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
17a70 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
17a80 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
17a90 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
17aa0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72  e);.}../*.** pAr
17ab0 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
17ac0 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
17ad0 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f  objects.  Each o
17ae0 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
17af0 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
17b00 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
17b10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
17b20 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  locates a new.**
17b30 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65   object on the e
17b40 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  nd of the array.
17b50 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20  .**.** *pnEntry 
17b60 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
17b70 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79   entries already
17b80 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c   in use.  *pnAll
17b90 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65  oc is.** the pre
17ba0 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
17bb0 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  d size of the ar
17bc0 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69  ray.  initSize i
17bd0 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74  s the.** suggest
17be0 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79  ed initial array
17bf0 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e   size allocation
17c00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
17c10 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74  x of the new ent
17c20 72 79 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ry is returned i
17c30 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54  n *pIdx..**.** T
17c40 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
17c50 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
17c60 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62   the array of ob
17c70 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20  jects.  This.** 
17c80 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
17c90 65 20 61 73 20 74 68 65 20 70 41 72 72 61 79 20  e as the pArray 
17ca0 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20  parameter or it 
17cb0 6d 69 67 68 74 20 62 65 20 61 20 64 69 66 66 65  might be a diffe
17cc0 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rent.** pointer 
17cd0 69 66 20 74 68 65 20 61 72 72 61 79 20 77 61 73  if the array was
17ce0 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69   resized..*/.voi
17cf0 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41  d *sqlite3ArrayA
17d00 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74  llocate(.  sqlit
17d10 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20  e3 *db,      /* 
17d20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
17d30 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
17d40 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
17d50 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f  d *pArray,     /
17d60 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  * Array of objec
17d70 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65  ts.  Might be re
17d80 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
17d90 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20  nt szEntry,     
17da0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68   /* Size of each
17db0 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61   object in the a
17dc0 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  rray */.  int in
17dd0 69 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53  itSize,     /* S
17de0 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c  uggested initial
17df0 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20   allocation, in 
17e00 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
17e10 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20  t *pnEntry,     
17e20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  /* Number of obj
17e30 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ects currently i
17e40 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  n use */.  int *
17e50 70 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20  pnAlloc,     /* 
17e60 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
17e70 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  the allocation, 
17e80 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  in elements */. 
17e90 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20   int *pIdx      
17ea0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
17eb0 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73  index of a new s
17ec0 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lot here */.){. 
17ed0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
17ee0 2a 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41  *pnEntry >= *pnA
17ef0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64  lloc ){.    void
17f00 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *pNew;.    int 
17f10 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77  newSize;.    new
17f20 53 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63  Size = (*pnAlloc
17f30 29 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a  )*2 + initSize;.
17f40 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
17f50 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
17f60 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a  pArray, newSize*
17f70 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
17f80 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
17f90 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
17fa0 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
17fb0 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ay;.    }.    *p
17fc0 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  nAlloc = sqlite3
17fd0 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
17fe0 20 70 4e 65 77 29 2f 73 7a 45 6e 74 72 79 3b 0a   pNew)/szEntry;.
17ff0 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65      pArray = pNe
18000 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68  w;.  }.  z = (ch
18010 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65  ar*)pArray;.  me
18020 6d 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79  mset(&z[*pnEntry
18030 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
18040 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
18050 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  x = *pnEntry;.  
18060 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
18070 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
18080 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
18090 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
180a0 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
180b0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
180c0 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
180d0 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
180e0 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
180f0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
18100 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
18110 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
18120 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71  3IdListAppend(sq
18130 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
18140 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
18150 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20  *pToken){.  int 
18160 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
18170 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
18180 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
18190 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
181a0 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
181b0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
181c0 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
181d0 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  t->nAlloc = 0;. 
181e0 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
181f0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
18200 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
18210 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
18220 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
18230 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
18240 20 35 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74   5,.      &pList
18250 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c  ->nId,.      &pL
18260 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20  ist->nAlloc,.   
18270 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28     &i.  );.  if(
18280 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   i<0 ){.    sqli
18290 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
182a0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
182b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
182c0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
182d0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
182e0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
182f0 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ken);.  return p
18300 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
18310 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
18320 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18330 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  IdListDelete(sql
18340 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
18350 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
18360 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
18370 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
18380 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
18390 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
183a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
183b0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
183c0 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
183d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
183e0 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
183f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
18400 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
18410 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
18420 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
18430 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
18440 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
18450 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
18460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
18470 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
18480 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
18490 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
184a0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
184b0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
184c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
184d0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
184e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
184f0 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
18500 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
18510 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
18520 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
18530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e  ;.}../*.** Expan
18540 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f  d the space allo
18550 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69  cated for the gi
18560 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65  ven SrcList obje
18570 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e  ct by.** creatin
18580 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f  g nExtra new slo
18590 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ts beginning at 
185a0 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20  iStart.  iStart 
185b0 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a  is zero based..*
185c0 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20  * New slots are 
185d0 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  zeroed..**.** Fo
185e0 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f  r example, suppo
185f0 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69  se a SrcList ini
18600 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20  tially contains 
18610 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42  two entries: A,B
18620 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33  ..** To append 3
18630 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74   new entries ont
18640 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68  o the end, do th
18650 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  is:.**.**    sql
18660 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
18670 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c  ge(db, pSrclist,
18680 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66   3, 2);.**.** Af
18690 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f  ter the call abo
186a0 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74  ve it would cont
186b0 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c  ain:  A, B, nil,
186c0 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66   nil, nil..** If
186d0 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75   the iStart argu
186e0 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20  ment had been 1 
186f0 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68  instead of 2, th
18700 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  en the result.**
18710 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
18720 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  :  A, nil, nil, 
18730 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70  nil, B.  To prep
18740 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74  end the new slot
18750 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74  s,.** the iStart
18760 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20   value would be 
18770 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74  0.  The result t
18780 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a  hen would.** be:
18790 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
187a0 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  A, B..**.** If a
187b0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
187c0 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63  on fails the Src
187d0 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65  List is unchange
187e0 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d  d.  The.** db->m
187f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
18800 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
18810 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  true..*/.SrcList
18820 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
18830 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74  Enlarge(.  sqlit
18840 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a  e3 *db,       /*
18850 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
18860 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
18870 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a  f OOM errors */.
18880 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
18890 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c       /* The SrcL
188a0 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67  ist to be enlarg
188b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
188c0 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ra,        /* Nu
188d0 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74  mber of new slot
188e0 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63  s to add to pSrc
188f0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ->a[] */.  int i
18900 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a  Start         /*
18910 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e   Index in pSrc->
18920 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77  a[] of first new
18930 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e   slot */.){.  in
18940 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  t i;..  /* Sanit
18950 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61  y checking on ca
18960 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  lling parameters
18970 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
18980 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  tart>=0 );.  ass
18990 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29  ert( nExtra>=1 )
189a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
189b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
189c0 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e   iStart<=pSrc->n
189d0 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  Src );..  /* All
189e0 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c  ocate additional
189f0 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64   space if needed
18a00 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
18a10 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
18a20 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
18a30 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
18a40 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
18a50 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
18a60 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b  a;.    int nGot;
18a70 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
18a80 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
18a90 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
18aa0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
18ab0 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
18ac0 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
18ad0 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
18ae0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
18af0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
18b00 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
18b10 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
18b20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
18b30 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
18b40 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
18b50 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
18b60 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
18b70 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
18b80 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
18b90 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 31 36 29 6e  >nAlloc = (u16)n
18ba0 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Got;.  }..  /* M
18bb0 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f  ove existing slo
18bc0 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74  ts that come aft
18bd0 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73  er the newly ins
18be0 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a  erted slots.  **
18bf0 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20   out of the way 
18c00 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  */.  for(i=pSrc-
18c10 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61  >nSrc-1; i>=iSta
18c20 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53  rt; i--){.    pS
18c30 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20  rc->a[i+nExtra] 
18c40 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  = pSrc->a[i];.  
18c50 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b  }.  pSrc->nSrc +
18c60 3d 20 28 69 31 36 29 6e 45 78 74 72 61 3b 0a 0a  = (i16)nExtra;..
18c70 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65    /* Zero the ne
18c80 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c  wly allocated sl
18c90 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ots */.  memset(
18ca0 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d  &pSrc->a[iStart]
18cb0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63  , 0, sizeof(pSrc
18cc0 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b  ->a[0])*nExtra);
18cd0 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b  .  for(i=iStart;
18ce0 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61   i<iStart+nExtra
18cf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63  ; i++){.    pSrc
18d00 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
18d10 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   -1;.  }..  /* R
18d20 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
18d30 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20  to the enlarged 
18d40 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74  SrcList */.  ret
18d50 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a  urn pSrc;.}.../*
18d60 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
18d70 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
18d80 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
18d90 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
18da0 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
18db0 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
18dc0 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
18dd0 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
18de0 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20  en if pTable is 
18df0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72  NULL..**.** A Sr
18e00 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
18e10 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  d, or NULL if th
18e20 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72  ere is an OOM er
18e30 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ror.  The return
18e40 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69  ed.** SrcList mi
18e50 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
18e60 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  as the SrcList t
18e70 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72  hat was input or
18e80 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
18e90 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61  a new one.  If a
18ea0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73  n OOM error does
18eb0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
18ec0 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66  e prior value of
18ed0 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69   pList.** that i
18ee0 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  s input to this 
18ef0 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d  routine is autom
18f00 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a  atically freed..
18f10 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
18f20 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
18f30 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
18f40 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
18f50 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
18f60 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
18f70 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
18f80 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
18f90 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
18fa0 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
18fb0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
18fc0 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
18fd0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18fe0 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
18ff0 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
19000 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
19010 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
19020 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
19030 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
19040 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
19050 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
19060 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
19070 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
19080 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
19090 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
190a0 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
190b0 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
190c0 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
190d0 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
190e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
190f0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
19100 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
19110 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
19120 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
19130 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,0);.**.** 
19140 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
19150 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
19160 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
19170 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
19180 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
19190 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
191a0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
191b0 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43  stAppend(D,A,B,C
191c0 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
191d0 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
191e0 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
191f0 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49  atabase name.  I
19200 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a  f C is defined.*
19210 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20  * then so is B. 
19220 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19230 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61   we never have a
19240 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a   case where:.**.
19250 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
19260 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
19270 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,0,C);.**.** 
19280 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20  Both pTable and 
19290 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73  pDatabase are as
192a0 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74  sumed to be quot
192b0 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65  ed.  They are de
192c0 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65  quoted.** before
192d0 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20   being added to 
192e0 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
192f0 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
19300 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  SrcListAppend(. 
19310 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
19320 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
19330 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
19340 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
19350 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c  */.  SrcList *pL
19360 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65  ist,     /* Appe
19370 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69  nd to this SrcLi
19380 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73  st. NULL creates
19390 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a   a new SrcList *
193a0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
193b0 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  e,      /* Table
193c0 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   to append */.  
193d0 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
193e0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
193f0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
19400 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
19410 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
19420 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
19430 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  base==0 || pTabl
19440 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  e!=0 );  /* Cann
19450 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75  ot have C withou
19460 74 20 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  t B */.  if( pLi
19470 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
19480 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
19490 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
194a0 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
194b0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
194c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
194d0 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
194e0 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20   1;.  }.  pList 
194f0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
19500 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73  Enlarge(db, pLis
19510 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72  t, 1, pList->nSr
19520 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
19530 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19540 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
19550 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
19560 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
19570 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
19580 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
19590 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
195a0 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
195b0 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
195c0 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
195d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
195e0 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b  abase ){.    Tok
195f0 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
19600 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
19610 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
19620 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
19630 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
19640 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
19650 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
19660 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65   pTable);.  pIte
19670 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
19680 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
19690 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73  ken(db, pDatabas
196a0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  e);.  return pLi
196b0 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
196c0 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69  ign VdbeCursor i
196d0 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20  ndex numbers to 
196e0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
196f0 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
19700 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
19710 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
19720 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
19730 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
19740 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
19750 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
19760 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73  m;.  assert(pLis
19770 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  t || pParse->db-
19780 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
19790 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
197a0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
197b0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
197c0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
197d0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
197e0 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72   if( pItem->iCur
197f0 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sor>=0 ) break;.
19800 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75        pItem->iCu
19810 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
19820 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
19830 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
19840 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19850 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
19860 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
19870 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
19880 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Src);.      }.  
19890 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
198a0 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
198b0 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
198c0 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
198d0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
198e0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
198f0 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
19900 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  db, SrcList *pLi
19910 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
19920 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
19930 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
19940 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
19950 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  urn;.  for(pItem
19960 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
19970 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
19980 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
19990 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
199a0 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  db, pItem->zData
199b0 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
199c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
199d0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
199e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
199f0 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
19a00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
19a10 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
19a20 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
19a30 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
19a40 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  b, pItem->pTab);
19a50 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
19a60 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  ctDelete(db, pIt
19a70 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
19a80 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
19a90 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
19aa0 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
19ab0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
19ac0 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b   pItem->pUsing);
19ad0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
19ae0 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
19af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
19b00 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
19b10 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
19b20 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
19b30 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
19b40 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
19b50 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
19b60 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
19b70 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
19b80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
19b90 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
19ba0 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
19bb0 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
19bc0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
19bd0 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
19be0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
19bf0 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
19c00 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
19c10 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
19c20 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
19c30 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
19c40 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
19c50 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
19c60 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
19c70 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
19c80 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
19c90 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
19ca0 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
19cb0 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e  as a alias, then
19cc0 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
19cd0 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
19ce0 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
19cf0 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
19d00 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
19d10 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
19d20 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
19d30 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
19d40 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
19d50 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
19d60 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
19d70 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
19d80 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
19d90 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
19da0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
19db0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
19dc0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
19dd0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
19de0 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
19df0 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
19e00 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
19e10 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
19e20 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
19e30 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
19e40 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
19e50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
19e60 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
19e70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
19e80 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
19e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19ea0 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
19eb0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19ec0 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
19ed0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
19ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
19ef0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
19f00 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
19f10 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
19f20 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
19f30 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
19f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
19f50 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
19f60 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
19f70 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
19f80 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
19f90 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
19fa0 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
19fb0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
19fc0 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
19fd0 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
19fe0 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
19ff0 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
1a000 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
1a010 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
1a020 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
1a030 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
1a040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a050 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1a060 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
1a070 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1a080 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
1a090 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1a0a0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70  se->db;.  if( !p
1a0b0 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69   && (pOn || pUsi
1a0c0 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ng) ){.    sqlit
1a0d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a0e0 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73  e, "a JOIN claus
1a0f0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
1a100 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20  fore %s", .     
1a110 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22   (pOn ? "ON" : "
1a120 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20  USING").    );. 
1a130 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1a140 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1a150 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
1a160 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c  istAppend(db, p,
1a170 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61   pTable, pDataba
1a180 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
1a190 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63  || NEVER(p->nSrc
1a1a0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==0) ){.    goto
1a1b0 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
1a1c0 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  or;.  }.  pItem 
1a1d0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1a1e0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41  1];.  assert( pA
1a1f0 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  lias!=0 );.  if(
1a200 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20   pAlias->n ){.  
1a210 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
1a220 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1a230 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61  mToken(db, pAlia
1a240 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  s);.  }.  pItem-
1a250 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71  >pSelect = pSubq
1a260 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  uery;.  pItem->p
1a270 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65  On = pOn;.  pIte
1a280 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69  m->pUsing = pUsi
1a290 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ng;.  return p;.
1a2a0 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  . append_from_er
1a2b0 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70  ror:.  assert( p
1a2c0 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1a2d0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1a2e0 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  On);.  sqlite3Id
1a2f0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1a300 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  Using);.  sqlite
1a310 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1a320 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , pSubquery);.  
1a330 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1a340 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
1a350 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
1a360 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
1a370 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1a380 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
1a390 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
1a3a0 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
1a3b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1a3c0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1a3d0 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
1a3e0 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
1a3f0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
1a400 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
1a410 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ){.  assert( pIn
1a420 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20  dexedBy!=0 );.  
1a430 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28  if( p && ALWAYS(
1a440 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20  p->nSrc>0) ){.  
1a450 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1a460 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1a470 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1a480 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
1a490 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  em->notIndexed==
1a4a0 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64  0 && pItem->zInd
1a4b0 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ex==0 );.    if(
1a4c0 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d   pIndexedBy->n==
1a4d0 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79  1 && !pIndexedBy
1a4e0 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ->z ){.      /* 
1a4f0 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20  A "NOT INDEXED" 
1a500 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c  clause was suppl
1a510 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79  ied. See parse.y
1a520 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74   .      ** const
1a530 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70  ruct "indexed_op
1a540 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  t" for details. 
1a550 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  */.      pItem->
1a560 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a  notIndexed = 1;.
1a570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a580 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d   pItem->zIndex =
1a590 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1a5a0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
1a5b0 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  , pIndexedBy);. 
1a5c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1a5d0 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
1a5e0 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
1a5f0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
1a600 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
1a610 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
1a620 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
1a630 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
1a640 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
1a650 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
1a660 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
1a670 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
1a680 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
1a690 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1a6a0 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
1a6b0 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
1a6c0 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
1a6d0 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
1a6e0 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
1a6f0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
1a700 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
1a710 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1a720 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
1a730 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
1a740 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
1a750 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
1a760 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
1a770 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
1a780 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
1a790 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
1a7a0 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
1a7b0 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
1a7c0 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
1a7d0 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
1a7e0 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
1a7f0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
1a800 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
1a810 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
1a820 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1a830 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
1a840 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
1a850 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20  ( p && p->a ){. 
1a860 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
1a870 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
1a880 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
1a890 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65  p->a[i].jointype
1a8a0 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69   = p->a[i-1].joi
1a8b0 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
1a8c0 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70   p->a[0].jointyp
1a8d0 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
1a8e0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
1a8f0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
1a900 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e  sqlite3BeginTran
1a910 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1a920 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29  Parse, int type)
1a930 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1a940 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
1a950 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
1a960 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64  pParse!=0 );.  d
1a970 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1a980 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
1a990 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61  );./*  if( db->a
1a9a0 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
1a9b0 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20  eturn; */.  if( 
1a9c0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1a9d0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1a9e0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
1a9f0 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  GIN", 0, 0) ){. 
1aa00 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1aa10 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1aa20 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1aa30 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
1aa40 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
1aa50 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
1aa60 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
1aa70 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
1aa80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1aa90 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
1aaa0 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
1aab0 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
1aac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1aad0 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
1aae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1aaf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ab00 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1ab10 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
1ab20 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73  * Commit a trans
1ab30 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
1ab40 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
1ab50 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1ab60 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1ab70 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1ab80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1ab90 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
1aba0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
1abb0 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1abc0 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /*  if( db->aDb[
1abd0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1abe0 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  rn; */.  if( sql
1abf0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ac00 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1ac10 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
1ac20 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  T", 0, 0) ){.   
1ac30 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
1ac40 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1ac50 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1ac60 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1ac70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ac80 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
1ac90 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1aca0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
1acb0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1acc0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
1acd0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1ace0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
1acf0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1ad00 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
1ad10 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
1ad20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1ad30 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
1ad40 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e   );./*  if( db->
1ad50 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1ad60 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28  return; */.  if(
1ad70 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1ad80 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1ad90 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
1ada0 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
1adb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1adc0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1add0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1ade0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1adf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ae00 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1ae10 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
1ae20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ae30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1ae40 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
1ae50 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63  en it parses a c
1ae60 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65  ommand to create
1ae70 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20  ,.** release or 
1ae80 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20  rollback an SQL 
1ae90 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76  savepoint. .*/.v
1aea0 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70  oid sqlite3Savep
1aeb0 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72  oint(Parse *pPar
1aec0 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65  se, int op, Toke
1aed0 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
1aee0 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1aef0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1af00 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1af10 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
1af20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
1af30 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1af40 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
1af50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1af60 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73  HORIZATION.    s
1af70 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1af80 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20   * const az[] = 
1af90 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45  { "BEGIN", "RELE
1afa0 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ASE", "ROLLBACK"
1afb0 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
1afc0 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e  !SAVEPOINT_BEGIN
1afd0 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   && SAVEPOINT_RE
1afe0 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45  LEASE==1 && SAVE
1aff0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d  POINT_ROLLBACK==
1b000 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  2 );.#endif.    
1b010 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65  if( !v || sqlite
1b020 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1b030 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f  e, SQLITE_SAVEPO
1b040 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61  INT, az[op], zNa
1b050 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  me, 0) ){.      
1b060 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1b070 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
1b080 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
1b090 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1b0a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1b0b0 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c  P_Savepoint, op,
1b0c0 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34   0, 0, zName, P4
1b0d0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
1b0e0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1b0f0 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  e the TEMP datab
1b100 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ase is open and 
1b110 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
1b120 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
1b130 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1b140 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65  rs.  Leave any e
1b150 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
1b160 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
1b170 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
1b180 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
1b190 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
1b1a0 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
1b1b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1b1c0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
1b1d0 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
1b1e0 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
1b1f0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1b200 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20   Btree *pBt;.   
1b210 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
1b220 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20  t flags = .     
1b230 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1b240 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20  _READWRITE |.   
1b250 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b260 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1b270 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1b280 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
1b290 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1b2a0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1b2b0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
1b2c0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
1b2d0 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  B;..    rc = sql
1b2e0 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 30 2c  ite3BtreeOpen(0,
1b2f0 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c   db, &pBt, 0, fl
1b300 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
1b310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b320 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b330 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1b340 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
1b350 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
1b360 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
1b370 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
1b380 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
1b390 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1b3a0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
1b3b0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1b3c0 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42     db->aDb[1].pB
1b3d0 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73  t = pBt;.    ass
1b3e0 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ert( db->aDb[1].
1b3f0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
1b400 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d  f( SQLITE_NOMEM=
1b410 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74  =sqlite3BtreeSet
1b420 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62  PageSize(pBt, db
1b430 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20  ->nextPagesize, 
1b440 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  -1, 0) ){.      
1b450 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b460 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
1b470 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b480 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1b490 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
1b4a0 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  BE code that wil
1b4b0 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  l verify the sch
1b4c0 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73  ema cookie and s
1b4d0 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74  tart.** a read-t
1b4e0 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61  ransaction for a
1b4f0 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  ll named databas
1b500 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  e files..**.** I
1b510 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
1b520 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63  hat all schema c
1b530 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69  ookies be verifi
1b540 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65  ed and all.** re
1b550 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ad transactions 
1b560 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
1b570 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  e anything else 
1b580 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68  happens in.** th
1b590 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20  e VDBE program. 
1b5a0 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
1b5b0 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
1b5c0 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72  after much other
1b5d0 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65  .** code has bee
1b5e0 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f  n generated.  So
1b5f0 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65   here is what we
1b600 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66   do:.**.** The f
1b610 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
1b620 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1b630 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f  , we code an OP_
1b640 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c  Goto that.** wil
1b650 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72  l jump to a subr
1b660 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e  outine at the en
1b670 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d of the program
1b680 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65  .  Then we.** re
1b690 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62  cord every datab
1b6a0 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69  ase that needs i
1b6b0 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69  ts schema verifi
1b6c0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61  ed in the.** pPa
1b6d0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1b6e0 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61  field.  Later, a
1b6f0 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63  fter all other c
1b700 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ode has been.** 
1b710 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73  generated, the s
1b720 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64  ubroutine that d
1b730 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  oes the cookie v
1b740 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64  erifications and
1b750 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74  .** starts the t
1b760 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c  ransactions will
1b770 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68   be coded and th
1b780 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c  e OP_Goto P2 val
1b790 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61  ue.** will be ma
1b7a0 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
1b7b0 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  hat subroutine. 
1b7c0 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20   The generation 
1b7d0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  of the.** cookie
1b7e0 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   verification su
1b7f0 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61  broutine code ha
1b800 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33  ppens in sqlite3
1b810 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
1b820 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74  **.** If iDb<0 t
1b830 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f  hen code the OP_
1b840 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27  Goto only - don'
1b850 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65  t set flag to ve
1b860 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65  rify the.** sche
1b870 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61  ma on any databa
1b880 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62  ses.  This can b
1b890 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69  e used to positi
1b8a0 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a  on the OP_Goto.*
1b8b0 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63  * early in the c
1b8c0 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b  ode, before we k
1b8d0 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62  now if any datab
1b8e0 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20  ase tables will 
1b8f0 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  be used..*/.void
1b900 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1b910 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
1b920 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
1b930 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1b940 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1b950 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1b960 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 6f 70  se);..  if( pTop
1b970 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74  level->cookieGot
1b980 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65  o==0 ){.    Vdbe
1b990 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
1b9a0 56 64 62 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b  Vdbe(pToplevel);
1b9b0 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
1b9c0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
1b9d0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
1b9e0 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
1b9f0 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  or error */.    
1ba00 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
1ba10 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  eGoto = sqlite3V
1ba20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ba30 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20  Goto, 0, 0)+1;. 
1ba40 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20   }.  if( iDb>=0 
1ba50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
1ba60 64 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  db = pToplevel->
1ba70 64 62 3b 0a 20 20 20 20 74 41 74 74 61 63 68 4d  db;.    tAttachM
1ba80 61 73 6b 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 61  ask mask;..    a
1ba90 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e  ssert( iDb<db->n
1baa0 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
1bab0 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
1bac0 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20  Bt!=0 || iDb==1 
1bad0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1bae0 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db<SQLITE_MAX_AT
1baf0 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20  TACHED+2 );.    
1bb00 6d 61 73 6b 20 3d 20 28 28 74 41 74 74 61 63 68  mask = ((tAttach
1bb10 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20  Mask)1)<<iDb;.  
1bb20 20 20 69 66 28 20 28 70 54 6f 70 6c 65 76 65 6c    if( (pToplevel
1bb30 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
1bb40 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1bb50 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
1bb60 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
1bb70 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1bb80 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
1bb90 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
1bba0 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
1bbb0 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69  _cookie;.      i
1bbc0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
1bbd0 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
1bbe0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
1bbf0 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f  TempDatabase(pTo
1bc00 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 7d  plevel);.      }
1bc10 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1bc20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
1bc30 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
1bc40 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
1bc50 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
1bc60 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
1bc70 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1bc80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bc90 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
1bca0 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
1bcb0 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
1bcc0 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
1bcd0 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
1bce0 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
1bcf0 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
1bd00 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
1bd10 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
1bd20 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
1bd30 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
1bd40 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
1bd50 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
1bd60 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
1bd70 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
1bd80 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
1bd90 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
1bda0 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
1bdb0 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
1bdc0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
1bdd0 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
1bde0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
1bdf0 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
1be00 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
1be10 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
1be20 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
1be30 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
1be40 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
1be50 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
1be60 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1be70 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
1be80 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
1be90 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
1bea0 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
1beb0 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
1bec0 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
1bed0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1bee0 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
1bef0 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
1bf00 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
1bf10 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
1bf20 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1bf30 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1bf40 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
1bf50 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1bf60 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1bf70 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74   pToplevel->writ
1bf80 65 4d 61 73 6b 20 7c 3d 20 28 28 74 41 74 74 61  eMask |= ((tAtta
1bf90 63 68 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a  chMask)1)<<iDb;.
1bfa0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
1bfb0 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74  ultiWrite |= set
1bfc0 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a  Statement;.}../*
1bfd0 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
1bfe0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
1bff0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
1c000 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67  construction mig
1c010 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65  ht write.** more
1c020 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20   than one entry 
1c030 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69  (example: deleti
1c040 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20  ng one row then 
1c050 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65  inserting anothe
1c060 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20  r,.** inserting 
1c070 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e  multiple rows in
1c080 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73   a table, or ins
1c090 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64  erting a row and
1c0a0 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29   index entries.)
1c0b0 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20  .** If an abort 
1c0c0 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d  occurs after som
1c0d0 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65  e of these write
1c0e0 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64  s have completed
1c0f0 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a  , then it will.*
1c100 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
1c110 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c  o undo the compl
1c120 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a  eted writes..*/.
1c130 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74  void sqlite3Mult
1c140 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50  iWrite(Parse *pP
1c150 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  arse){.  Parse *
1c160 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1c170 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1c180 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70  (pParse);.  pTop
1c190 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
1c1a0 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a  ite = 1;.}../* .
1c1b0 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
1c1c0 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73  rator calls this
1c1d0 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64   routine if is d
1c1e0 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74  iscovers that it
1c1f0 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20   is.** possible 
1c200 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65  to abort a state
1c210 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f  ment prior to co
1c220 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72  mpletion.  In or
1c230 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f  der to .** perfo
1c240 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69  rm this abort wi
1c250 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67  thout corrupting
1c260 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77   the database, w
1c270 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a  e need to make.*
1c280 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  * sure that the 
1c290 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f  statement is pro
1c2a0 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74  tected by a stat
1c2b0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1c2c0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63  n..**.** Technic
1c2d0 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65  ally, we only ne
1c2e0 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  ed to set the ma
1c2f0 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74  yAbort flag if t
1c300 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69  he.** isMultiWri
1c310 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76  te flag was prev
1c320 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65  iously set.  The
1c330 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70  re is a time dep
1c340 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20  endency.** such 
1c350 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d  that the abort m
1c360 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20  ust occur after 
1c370 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20  the multiwrite. 
1c380 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73   This makes.** s
1c390 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ome statements i
1c3a0 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50  nvolving the REP
1c3b0 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65  LACE conflict re
1c3c0 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
1c3d0 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c  hm.** go a littl
1c3e0 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74  e faster.  But t
1c3f0 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20  aking advantage 
1c400 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70  of this time dep
1c410 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73  endency.** makes
1c420 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75   it more difficu
1c430 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74  lt to prove that
1c440 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72   the code is cor
1c450 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72  rect (in .** par
1c460 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76  ticular, it prev
1c470 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69  ents us from wri
1c480 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76  ting an effectiv
1c490 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1c4a0 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73  ion of sqlite3As
1c4b0 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20  sertMayAbort()) 
1c4c0 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63  and so we have c
1c4d0 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65  hosen.** to take
1c4e0 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20   the safe route 
1c4f0 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74  and skip the opt
1c500 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  imization..*/.vo
1c510 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  id sqlite3MayAbo
1c520 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rt(Parse *pParse
1c530 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1c540 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1c550 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1c560 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  rse);.  pTopleve
1c570 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b  l->mayAbort = 1;
1c580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
1c590 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63  n OP_Halt that c
1c5a0 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74  auses the vdbe t
1c5b0 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  o return an SQLI
1c5c0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a  TE_CONSTRAINT.**
1c5d0 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72   error. The onEr
1c5e0 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  ror parameter de
1c5f0 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28  termines which (
1c600 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73  if any) of the s
1c610 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f  tatement.** and/
1c620 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  or current trans
1c630 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1c640 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   back..*/.void s
1c650 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
1c660 61 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72  aint(Parse *pPar
1c670 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  se, int onError,
1c680 20 63 68 61 72 20 2a 70 34 2c 20 69 6e 74 20 70   char *p4, int p
1c690 34 74 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a  4type){.  Vdbe *
1c6a0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1c6b0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1c6c0 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  ( onError==OE_Ab
1c6d0 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ort ){.    sqlit
1c6e0 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
1c6f0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1c700 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1c710 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43  P_Halt, SQLITE_C
1c720 4f 4e 53 54 52 41 49 4e 54 2c 20 6f 6e 45 72 72  ONSTRAINT, onErr
1c730 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70  or, 0, p4, p4typ
1c740 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  e);.}../*.** Che
1c750 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
1c760 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
1c770 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1c780 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
1c790 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
1c7a0 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
1c7b0 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
1c7c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c7d0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
1c7e0 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
1c7f0 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
1c800 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70  *zColl, Index *p
1c810 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b  Index){.  int i;
1c820 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c  .  assert( zColl
1c830 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
1c840 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ; i<pIndex->nCol
1c850 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  umn; i++){.    c
1c860 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
1c870 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1c880 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21  ;.    assert( z!
1c890 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =0 );.    if( 0=
1c8a0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
1c8b0 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  z, zColl) ){.   
1c8c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1c8d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c8e0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
1c8f0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
1c900 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
1c910 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f   that use the co
1c920 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1c930 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43   pColl..** If pC
1c940 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
1c950 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
1c960 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69  s of pTab..*/.#i
1c970 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c980 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1c990 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62   void reindexTab
1c9a0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
1c9b0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  , Table *pTab, c
1c9c0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1c9d0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
1c9e0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
1c9f0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
1ca00 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
1ca10 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64  b */..  for(pInd
1ca20 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  ex=pTab->pIndex;
1ca30 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
1ca40 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a  pIndex->pNext){.
1ca50 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30      if( zColl==0
1ca60 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74   || collationMat
1ca70 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78  ch(zColl, pIndex
1ca80 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
1ca90 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
1caa0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
1cab0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
1cac0 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ema);.      sqli
1cad0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1cae0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
1caf0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
1cb00 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
1cb10 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
1cb20 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
1cb30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1cb40 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
1cb50 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
1cb60 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
1cb70 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
1cb80 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
1cb90 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
1cba0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
1cbb0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
1cbc0 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
1cbd0 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
1cbe0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
1cbf0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1cc00 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
1cc10 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
1cc20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
1cc30 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
1cc40 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  {.  Db *pDb;    
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc60 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61  /* A single data
1cc70 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
1cc80 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1cc90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1cca0 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
1ccb0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
1ccc0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1ccd0 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
1cce0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1ccf0 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1cd20 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44  ver tables in pD
1cd30 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
1cd40 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
1cd50 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
1cd60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1cd70 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70  ..  for(iDb=0, p
1cd80 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c  Db=db->aDb; iDb<
1cd90 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20  db->nDb; iDb++, 
1cda0 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  pDb++){.    asse
1cdb0 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20  rt( pDb!=0 );.  
1cdc0 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
1cdd0 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53  shFirst(&pDb->pS
1cde0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
1cdf0 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73    k; k=sqliteHas
1ce00 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
1ce10 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
1ce20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
1ce30 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  );.      reindex
1ce40 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
1ce50 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ab, zColl);.    
1ce60 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
1ce70 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1ce80 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e  ode for the REIN
1ce90 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
1cea0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1ceb0 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X               
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
1ced0 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  1.**        REIN
1cee0 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e  DEX  <collation>
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
1cf00 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 2.**        RE
1cf10 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
1cf20 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
1cf30 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20   -- 3.**        
1cf40 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
1cf50 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65  ase>.?<indexname
1cf60 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 4.**.** Fo
1cf70 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
1cf80 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
1cf90 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
1cfa0 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e  s to be rebuilt.
1cfb0 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69  .** Form 2 rebui
1cfc0 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  lds all indices 
1cfd0 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
1cfe0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61   that use the na
1cff0 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  med.** collating
1d000 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d   function.  Form
1d010 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c  s 3 and 4 rebuil
1d020 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
1d030 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69  x or all.** indi
1d040 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
1d050 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61  ith the named ta
1d060 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ble..*/.#ifndef 
1d070 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
1d080 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  DEX.void sqlite3
1d090 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70  Reindex(Parse *p
1d0a0 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
1d0b0 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  ame1, Token *pNa
1d0c0 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  me2){.  CollSeq 
1d0d0 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
1d0e0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
1d0f0 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20   sequence to be 
1d100 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55  reindexed, or NU
1d110 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  LL */.  char *z;
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d130 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
1d140 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1d150 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1d160 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
1d170 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1d180 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61  database */.  Ta
1d190 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
1d1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
1d1b0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
1d1c0 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  base */.  Index 
1d1d0 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
1d1e0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
1d1f0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1d200 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  h pTab */.  int 
1d210 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
1d220 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1d230 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
1d240 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
1d250 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1d260 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
1d270 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d280 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62   */.  Token *pOb
1d290 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  jName;          
1d2a0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1d2b0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
1d2c0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20  to be reindexed 
1d2d0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
1d2e0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1d2f0 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
1d300 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
1d310 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
1d320 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
1d330 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
1d340 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
1d350 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1d360 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
1d370 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
1d380 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
1d390 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Name1==0 ){.    
1d3a0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1d3b0 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
1d3c0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
1d3d0 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65   if( NEVER(pName
1d3e0 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d  2==0) || pName2-
1d3f0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  >z==0 ){.    cha
1d400 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73  r *zColl;.    as
1d410 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20  sert( pName1->z 
1d420 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73  );.    zColl = s
1d430 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1d440 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
1d450 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
1d460 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
1d470 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
1d480 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
1d490 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
1d4a0 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  oll, 0);.    if(
1d4b0 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
1d4c0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1d4d0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
1d4e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1d4f0 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
1d500 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
1d510 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1d520 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
1d530 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
1d540 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
1d550 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
1d560 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
1d570 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
1d580 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
1d590 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1d5a0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e  mToken(db, pObjN
1d5b0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
1d5c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62   ) return;.  zDb
1d5d0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1d5e0 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20  zName;.  pTab = 
1d5f0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1d600 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1d610 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
1d620 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61  reindexTable(pPa
1d630 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20  rse, pTab, 0);. 
1d640 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1d650 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74  (db, z);.    ret
1d660 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  urn;.  }.  pInde
1d670 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
1d680 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29  ndex(db, z, zDb)
1d690 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1d6a0 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20  e(db, z);.  if( 
1d6b0 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71  pIndex ){.    sq
1d6c0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1d6d0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1d6e0 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   0, iDb);.    sq
1d6f0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
1d700 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
1d710 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
1d720 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1d730 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1d740 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74  "unable to ident
1d750 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74  ify the object t
1d760 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29  o be reindexed")
1d770 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1d780 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d  * Return a dynam
1d790 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b  icly allocated K
1d7a0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1d7b0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1d7c0 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65  d.** with OP_Ope
1d7d0 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e  nRead or OP_Open
1d7e0 57 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  Write to access 
1d7f0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70  database index p
1d800 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Idx..**.** If su
1d810 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e  ccessful, a poin
1d820 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73  ter to the new s
1d830 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75  tructure is retu
1d840 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
1d850 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  se.** the caller
1d860 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1d870 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  for calling sqli
1d880 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 29 20  te3DbFree(db, ) 
1d890 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
1d8a0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20  .** pointer. If 
1d8b0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1d8c0 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f  (out of memory o
1d8d0 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74  r missing collat
1d8e0 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ion .** sequence
1d8f0 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ), NULL is retur
1d900 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74 61 74  ned and the stat
1d910 65 20 6f 66 20 70 50 61 72 73 65 20 75 70 64 61  e of pParse upda
1d920 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a  ted to reflect.*
1d930 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a  * the error..*/.
1d940 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
1d950 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72  IndexKeyinfo(Par
1d960 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
1d970 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
1d980 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i;.  int nCol = 
1d990 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
1d9a0 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69   int nBytes = si
1d9b0 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
1d9c0 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28  (nCol-1)*sizeof(
1d9d0 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c  CollSeq*) + nCol
1d9e0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1d9f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1da00 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
1da10 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74  (KeyInfo *)sqlit
1da20 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1da30 62 2c 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69  b, nBytes);..  i
1da40 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70  f( pKey ){.    p
1da50 4b 65 79 2d 3e 64 62 20 3d 20 70 50 61 72 73 65  Key->db = pParse
1da60 2d 3e 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e  ->db;.    pKey->
1da70 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
1da80 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c   *)&(pKey->aColl
1da90 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73  [nCol]);.    ass
1daa0 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72  ert( &pKey->aSor
1dab0 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28  tOrder[nCol]==&(
1dac0 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79  ((u8 *)pKey)[nBy
1dad0 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72  tes]) );.    for
1dae0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
1daf0 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
1db00 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
1db10 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61  Coll[i];.      a
1db20 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a  ssert( zColl );.
1db30 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
1db40 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f  l[i] = sqlite3Lo
1db50 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
1db60 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
1db70 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1db80 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
1db90 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
1dba0 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69   }.    pKey->nFi
1dbb0 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b  eld = (u16)nCol;
1dbc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72  .  }..  if( pPar
1dbd0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1dbe0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1dbf0 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65  , pKey);.    pKe
1dc00 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
1dc10 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a              urn pKey;.}.