/ Hex Artifact Content
Login

Artifact 9d48f4023d5e3d0a6807f1f531d8d7187d252c57:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61   *v;..  db = pPa
0f40: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
0f50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f70: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
0f80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
0f90: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
0fa0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  turn;..  /* Begi
0fb0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
0fc0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
0fd0: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
0fe0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
0ff0: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1000: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1010: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1020: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1030: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1040: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1050: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1060: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
1070: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
1080: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1090: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
10a0: 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Halt);..    /* T
10b0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
10c0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
10d0: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
10e0: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
10f0: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
1100: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
1110: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
1120: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
1130: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
1140: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1150: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
1160: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1170: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
1180: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
1190: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
11a0: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
11b0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
11c0: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
11d0: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
11e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11f0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1200: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32  o>0 ){.      u32
1210: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74   mask;.      int
1220: 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69   iDb;.      sqli
1230: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1240: 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  v, pParse->cooki
1250: 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20  eGoto-1);.      
1260: 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d  for(iDb=0, mask=
1270: 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  1; iDb<db->nDb; 
1280: 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29  mask<<=1, iDb++)
1290: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
12a0: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f  ask & pParse->co
12b0: 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63  okieMask)==0 ) c
12c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12d0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
12e0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f 54 72  beAddOp2(v,OP_Tr
1310: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20  ansaction, iDb, 
1320: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1330: 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b 0a  writeMask)!=0);.
1340: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
1350: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
1360: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50  3VdbeAddOp2(v,OP
1380: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
1390: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
13a0: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
13b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13e0: 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
13f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
1400: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
1410: 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69  se->nVtabLock; i
1420: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
1430: 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61  har *vtab = (cha
1440: 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54  r *)sqlite3GetVT
1450: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
1460: 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29 3b  >apVtabLock[i]);
1470: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1480: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1490: 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c  OP_VBegin, 0, 0,
14a0: 20 30 2c 20 76 74 61 62 2c 20 50 34 5f 56 54 41   0, vtab, P4_VTA
14b0: 42 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  B);.        }.  
14c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
14d0: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  tabLock = 0;.   
14e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
14f0: 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74     /* Once all t
1500: 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20  he cookies have 
1510: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e  been verified an
1520: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  d transactions o
1530: 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a  pened, .      **
1540: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
1550: 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73  ired table-locks
1560: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
1570: 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20  p unless the .  
1580: 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61      ** shared-ca
1590: 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65  che feature is e
15a0: 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  nabled..      */
15b0: 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65  .      codeTable
15c0: 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 0a  Locks(pParse);..
15d0: 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
15e0: 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43 52  ize any AUTOINCR
15f0: 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75 63  EMENT data struc
1600: 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e 0a  tures required..
1610: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1620: 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
1630: 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65 29  entBegin(pParse)
1640: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  ;..      /* Fina
1650: 6c 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20 74  lly, jump back t
1660: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1670: 6f 66 20 74 68 65 20 65 78 65 63 75 74 61 62 6c  of the executabl
1680: 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  e code. */.     
1690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16a0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
16b0: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
16c0: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Goto);.    }.  }
16d0: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
16e0: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
16f0: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
1700: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
1710: 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e   ALWAYS(pParse->
1720: 6e 45 72 72 3d 3d 30 29 20 26 26 20 21 64 62 2d  nErr==0) && !db-
1730: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1750: 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74  EBUG.    FILE *t
1760: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
1770: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
1780: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
1790: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
17a0: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
17b0: 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  race);.#endif.  
17c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
17d0: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30  ->iCacheLevel==0
17e0: 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73   );  /* Disables
17f0: 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20   and re-enables 
1800: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20  match */.    /* 
1810: 41 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65  A minimum of one
1820: 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 69   cursor is requi
1830: 72 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65  red if autoincre
1840: 6d 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20  ment is used.   
1850: 20 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b   *  See ticket [
1860: 61 36 39 36 33 37 39 63 31 66 30 38 38 36 36 5d  a696379c1f08866]
1870: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
1880: 73 65 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26 20  se->pAinc!=0 && 
1890: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20  pParse->nTab==0 
18a0: 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d  ) pParse->nTab =
18b0: 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   1;.    sqlite3V
18c0: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20  dbeMakeReady(v, 
18d0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50  pParse->nVar, pP
18e0: 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20  arse->nMem,.    
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
1910: 62 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41  b, pParse->nMaxA
1920: 72 67 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  rg, pParse->expl
1930: 61 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ain,.           
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1950: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
1960: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
1970: 79 41 62 6f 72 74 29 3b 0a 20 20 20 20 70 50 61  yAbort);.    pPa
1980: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1990: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
19a0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
19b0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
19c0: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
19d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
19e0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
19f0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   0;.  pParse->nM
1a00: 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  em = 0;.  pParse
1a10: 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50  ->nSet = 0;.  pP
1a20: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a  arse->nVar = 0;.
1a30: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
1a40: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72  Mask = 0;.  pPar
1a50: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
1a60: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e   0;.}../*.** Run
1a70: 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20   the parser and 
1a80: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72  code generator r
1a90: 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72  ecursively in or
1aa0: 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a  der to generate.
1ab0: 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ** code for the 
1ac0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69  SQL statement gi
1ad0: 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ven onto the end
1ae0: 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63   of the pParse c
1af0: 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e  ontext.** curren
1b00: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
1b10: 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68  uction.  When th
1b20: 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20  e parser is run 
1b30: 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74  recursively.** t
1b40: 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e  his way, the fin
1b50: 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f  al OP_Halt is no
1b60: 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f  t appended and o
1b70: 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74  ther initializat
1b80: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c  ion.** and final
1b90: 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72  ization steps ar
1ba0: 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73  e omitted becaus
1bb0: 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64  e those are hand
1bc0: 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f  ling by the.** o
1bd0: 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e  utermost parser.
1be0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79  .**.** Not every
1bf0: 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c  thing is nestabl
1c00: 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74  e.  This facilit
1c10: 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  y is designed to
1c20: 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52   permit.** INSER
1c30: 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44  T, UPDATE, and D
1c40: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
1c50: 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f   against SQLITE_
1c60: 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20  MASTER.  Use.** 
1c70: 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69  care if you deci
1c80: 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65  de to try to use
1c90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f   this routine fo
1ca0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1cb0: 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  poses..*/.void s
1cc0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1cd0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1ce0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
1cf0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
1d00: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
1d10: 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a   *zSql;.  char *
1d20: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73  zErrMsg = 0;.  s
1d30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d40: 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e  rse->db;.# defin
1d50: 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65  e SAVE_SZ  (size
1d60: 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73  of(Parse) - offs
1d70: 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29  etof(Parse,nVar)
1d80: 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 66  ).  char saveBuf
1d90: 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66  [SAVE_SZ];..  if
1da0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1db0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
1dc0: 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  t( pParse->neste
1dd0: 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74  d<10 );  /* Nest
1de0: 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ing should only 
1df0: 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65  be of limited de
1e00: 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72  pth */.  va_star
1e10: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
1e20: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1e30: 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f  VMPrintf(db, zFo
1e40: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1e50: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
1e60: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
1e70: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
1e80: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1e90: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1ea0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1eb0: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1ec0: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1ed0: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1ee0: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1ef0: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1f00: 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73    sqlite3RunPars
1f10: 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c  er(pParse, zSql,
1f20: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71   &zErrMsg);.  sq
1f30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f40: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1f50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
1f60: 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  ql);.  memcpy(&p
1f70: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76  Parse->nVar, sav
1f80: 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  eBuf, SAVE_SZ);.
1f90: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1fa0: 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  --;.}../*.** Loc
1fb0: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
1fc0: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
1fd0: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
1fe0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
1ff0: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
2000: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2010: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
2020: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
2030: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2040: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2050: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2060: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2070: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
2080: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
2090: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
20a0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
20b0: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a   table and the.*
20c0: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  * first matching
20d0: 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e   table is return
20e0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
20f0: 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  g for duplicate 
2100: 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69  table.** names i
2110: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
2120: 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45  arch order is TE
2130: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
2140: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a  AIN, then any.**
2150: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2160: 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67  ases added using
2170: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
2180: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  and..**.** See a
2190: 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  lso sqlite3Locat
21a0: 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62  eTable()..*/.Tab
21b0: 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54  le *sqlite3FindT
21c0: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
21d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
21e0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
21f0: 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54  *zDatabase){.  T
2200: 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69  able *p = 0;.  i
2210: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  nt i;.  int nNam
2220: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61  e;.  assert( zNa
2230: 6d 65 21 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d 65  me!=0 );.  nName
2240: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2250: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  30(zName);.  for
2260: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2270: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2280: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2290: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
22a0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
22b0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
22c0: 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21    if( zDatabase!
22d0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
22e0: 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20  ICmp(zDatabase, 
22f0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
2300: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2310: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
2320: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
2330: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
2340: 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  sh, zName, nName
2350: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
2360: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
2370: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
2380: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
2390: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
23a0: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
23b0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
23c0: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
23d0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
23e0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
23f0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
2400: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
2410: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
2420: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2430: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2440: 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61  found.  Also lea
2450: 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d  ve an.** error m
2460: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2470: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
2480: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2490: 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
24a0: 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33  tine and sqlite3
24b0: 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74  FindTable() is t
24c0: 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hat this.** rout
24d0: 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72  ine leaves an er
24e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
24f0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77  Parse->zErrMsg w
2500: 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46  here.** sqlite3F
2510: 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20  indTable() does 
2520: 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  not..*/.Table *s
2530: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2540: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
2550: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63  se,         /* c
2560: 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68 20  ontext in which 
2570: 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  to report errors
2580: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77   */.  int isView
2590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
25a0: 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20  True if looking 
25b0: 66 6f 72 20 61 20 56 49 45 57 20 72 61 74 68 65  for a VIEW rathe
25c0: 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45 20 2a  r than a TABLE *
25d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25e0: 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61  zName,     /* Na
25f0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
2600: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  we are looking f
2610: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
2620: 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f  ar *zDbase     /
2630: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2640: 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62  tabase.  Might b
2650: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54  e NULL */.){.  T
2660: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
2670: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
2680: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
2690: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
26a0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
26b0: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
26c0: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
26d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
26e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
26f0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
2700: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
2710: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2720: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
2730: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
2740: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2750: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2760: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2770: 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65 77 20   *zMsg = isView 
2780: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
2790: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
27a0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61  e";.    if( zDba
27b0: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
27c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
27d0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
27e0: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
27f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
2800: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2810: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2820: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
2830: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
2840: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
2850: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
2860: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2870: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
2880: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
2890: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
28a0: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
28b0: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
28c0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
28d0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
28e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
28f0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
2900: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
2910: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
2920: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
2930: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
2940: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
2950: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
2960: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
2970: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
2980: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
2990: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
29a0: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
29b0: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
29c0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
29d0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
29e0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
29f0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2a00: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
2a10: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
2a20: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
2a30: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
2a40: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
2a50: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
2a60: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
2a70: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
2a80: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
2a90: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
2aa0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  t i;.  int nName
2ab0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2ac0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  30(zName);.  for
2ad0: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2ae0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2af0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2b00: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
2b10: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
2b20: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
2b30: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
2b40: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
2b50: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
2b60: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
2b70: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
2b80: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
2b90: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
2ba0: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
2bb0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
2bc0: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
2bd0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
2be0: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   nName);.    if(
2bf0: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
2c00: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2c10: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
2c20: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
2c30: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
2c40: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
2c50: 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73  x(Index *p){.  s
2c60: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
2c70: 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 23  pTable->dbMem;.#
2c80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c90: 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c  IT_ANALYZE.  sql
2ca0: 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53  ite3DeleteIndexS
2cb0: 61 6d 70 6c 65 73 28 70 29 3b 0a 23 65 6e 64 69  amples(p);.#endi
2cc0: 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  f.  sqlite3DbFre
2cd0: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
2ce0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2cf0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
2d00: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67  .** Remove the g
2d10: 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20  iven index from 
2d20: 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20 74  the index hash t
2d30: 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a  able, and free.*
2d40: 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72  * its memory str
2d50: 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  uctures..**.** T
2d60: 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f  he index is remo
2d70: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ved from the dat
2d80: 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c 65  abase hash table
2d90: 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e  s but.** it is n
2da0: 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  ot unlinked from
2db0: 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74 20   the Table that 
2dc0: 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55  it indexes..** U
2dd0: 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68  nlinking from th
2de0: 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20  e Table must be 
2df0: 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c  done by the call
2e00: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
2e10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2e20: 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 28  ite3DeleteIndex(
2e30: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64  Index *p){.  Ind
2e40: 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73  ex *pOld;.  cons
2e50: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
2e60: 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c  p->zName;..  pOl
2e70: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
2e80: 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d  nsert(&p->pSchem
2e90: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
2ea0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2ec0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
2ed0: 61 6d 65 29 2c 20 30 29 3b 0a 20 20 61 73 73 65  ame), 0);.  asse
2ee0: 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70  rt( pOld==0 || p
2ef0: 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65  Old==p );.  free
2f00: 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  Index(p);.}../*.
2f10: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
2f20: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
2f30: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
2f40: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2f50: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
2f60: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
2f70: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
2f80: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
2f90: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
2fa0: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
2fb0: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
2fc0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
2fd0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
2fe0: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
2ff0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
3000: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
3010: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
3020: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
3030: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
3040: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  x *pIndex;.  int
3050: 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48   len;.  Hash *pH
3060: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
3070: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
3080: 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73  Hash;..  len = s
3090: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
30a0: 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  IdxName);.  pInd
30b0: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
30c0: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49  Insert(pHash, zI
30d0: 64 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b  dxName, len, 0);
30e0: 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
30f0: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
3100: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
3110: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
3120: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3130: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
3140: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
3150: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
3160: 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73  *p;.      /* Jus
3170: 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c  tification of AL
3180: 57 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64  WAYS();  The ind
3190: 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68  ex must be on th
31a0: 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20  e list of.      
31b0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20  ** indices. */. 
31c0: 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d       p = pIndex-
31d0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
31e0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
31f0: 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e  WAYS(p) && p->pN
3200: 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70  ext!=pIndex ){ p
3210: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20   = p->pNext; }. 
3220: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
3230: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
3240: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
3250: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
3260: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3270: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
3280: 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  eeIndex(pIndex);
3290: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
32a0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
32b0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
32c0: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
32d0: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
32e0: 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  from the in-memo
32f0: 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f  ry hash tables o
3300: 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64 61  f.** a single da
3310: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
3320: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
3330: 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72  to reclaim memor
3340: 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20  y.** before the 
3350: 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e  database closes.
3360: 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c    It is also cal
3370: 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  led during a rol
3380: 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72  lback.** if ther
3390: 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68  e were schema ch
33a0: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
33b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
33c0: 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63  if a.** schema-c
33d0: 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f  ookie mismatch o
33e0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ccurs..**.** If 
33f0: 69 44 62 3d 3d 30 20 74 68 65 6e 20 72 65 73 65  iDb==0 then rese
3400: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
3410: 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72  chema tables for
3420: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
3430: 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e   files.  If iDb>
3440: 3d 31 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =1 then reset th
3450: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
3460: 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a  a for only the.*
3470: 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e  * single file in
3480: 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dicated..*/.void
3490: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
34a0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69  ernalSchema(sqli
34b0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
34c0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
34d0: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
34e0: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
34f0: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20  ;..  if( iDb==0 
3500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
3510: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
3520: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 44 62  .  }.  for(i=iDb
3530: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3540: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
3550: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
3560: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
3570: 6d 61 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ma ){.      asse
3580: 72 74 28 69 3d 3d 31 20 7c 7c 20 28 70 44 62 2d  rt(i==1 || (pDb-
3590: 3e 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42  >pBt && sqlite3B
35a0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
35b0: 44 62 2d 3e 70 42 74 29 29 29 3b 0a 20 20 20 20  Db->pBt)));.    
35c0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 46    sqlite3SchemaF
35d0: 72 65 65 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ree(pDb->pSchema
35e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
35f0: 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b   iDb>0 ) return;
3600: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
3610: 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66  Db==0 );.  db->f
3620: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
3630: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
3640: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
3650: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71  ckList(db);.  sq
3660: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
3670: 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ll(db);..  /* If
3680: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
3690: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
36a0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
36b0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
36c0: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
36d0: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hem from the aux
36e0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
36f0: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
3700: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
3710: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
3720: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
3730: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
3740: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
3750: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
3760: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
3770: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
3780: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
3790: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
37a0: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
37b0: 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69  /.  for(i=j=2; i
37c0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
37d0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
37e0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
37f0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3800: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Bt==0 ){.      s
3810: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3820: 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20   pDb->zName);.  
3830: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
3840: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
3850: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
3860: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
3870: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
3880: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
3890: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
38a0: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
38b0: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
38c0: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
38d0: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
38e0: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
38f0: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
3900: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
3910: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
3920: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
3930: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
3940: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
3950: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3960: 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  , db->aDb);.    
3970: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
3980: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
3990: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
39a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
39b0: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
39c0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
39d0: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
39e0: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
39f0: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
3a00: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3a10: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
3a20: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
3a30: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
3a40: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
3a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3a60: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
3a70: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
3a80: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
3a90: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3aa0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3ab0: 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a   pTable->dbMem;.
3ac0: 20 20 74 65 73 74 63 61 73 65 28 20 64 62 3d 3d    testcase( db==
3ad0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3ae0: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  Table!=0 );.  if
3af0: 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65  ( (pCol = pTable
3b00: 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20  ->aCol)!=0 ){.  
3b10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
3b20: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  ble->nCol; i++, 
3b30: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73  pCol++){.      s
3b40: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3b50: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
3b60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3b70: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
3b80: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73  >pDflt);.      s
3b90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3ba0: 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20   pCol->zDflt);. 
3bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3bc0: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79  ee(db, pCol->zTy
3bd0: 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pe);.      sqlit
3be0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
3bf0: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
3c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3c10: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61  ee(db, pTable->a
3c20: 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62  Col);.  }.  pTab
3c30: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
3c40: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
3c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
3c60: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74  e the memory dat
3c70: 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  a structures ass
3c80: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
3c90: 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e   given.** Table.
3ca0: 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65    No changes are
3cb0: 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79   made to disk by
3cc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
3cd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3ce0: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74  e just deletes t
3cf0: 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  he data structur
3d00: 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  e.  It does not 
3d10: 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61  unlink.** the ta
3d20: 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ble data structu
3d30: 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  re from the hash
3d40: 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20   table.  But it 
3d50: 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20  does destroy.** 
3d60: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
3d70: 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73  s of the indices
3d80: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
3d90: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3da0: 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e  h .** the table.
3db0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3dc0: 44 65 6c 65 74 65 54 61 62 6c 65 28 54 61 62 6c  DeleteTable(Tabl
3dd0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
3de0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
3df0: 65 78 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ext;.  sqlite3 *
3e00: 64 62 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c  db;..  if( pTabl
3e10: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
3e20: 20 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62   db = pTable->db
3e30: 4d 65 6d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  Mem;.  testcase(
3e40: 20 64 62 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20   db==0 );..  /* 
3e50: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
3e60: 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68  e table until th
3e70: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
3e80: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  t reaches zero. 
3e90: 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  */.  pTable->nRe
3ea0: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  f--;.  if( pTabl
3eb0: 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  e->nRef>0 ){.   
3ec0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
3ed0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
3ee0: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
3ef0: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
3f00: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3f10: 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  th this table.  
3f20: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
3f30: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
3f40: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
3f50: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
3f60: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
3f70: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
3f80: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d  pIndex->pSchema=
3f90: 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61  =pTable->pSchema
3fa0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
3fb0: 65 6c 65 74 65 49 6e 64 65 78 28 70 49 6e 64 65  eleteIndex(pInde
3fc0: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  x);.  }..  /* De
3fd0: 6c 65 74 65 20 61 6e 79 20 66 6f 72 65 69 67 6e  lete any foreign
3fe0: 20 6b 65 79 73 20 61 74 74 61 63 68 65 64 20 74   keys attached t
3ff0: 6f 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  o this table. */
4000: 0a 20 20 73 71 6c 69 74 65 33 46 6b 44 65 6c 65  .  sqlite3FkDele
4010: 74 65 28 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f  te(pTable);..  /
4020: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
4030: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
4040: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
4050: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
4060: 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  es(pTable);.  sq
4070: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4080: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
4090: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
40a0: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c  db, pTable->zCol
40b0: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Aff);.  sqlite3S
40c0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
40d0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
40e0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
40f0: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71  _OMIT_CHECK.  sq
4100: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4110: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  db, pTable->pChe
4120: 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  ck);.#endif.  sq
4130: 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28 70  lite3VtabClear(p
4140: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
4150: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4160: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
4170: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
4180: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
4190: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
41a0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
41b0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
41c0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
41d0: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
41e0: 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   keys..*/.void s
41f0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
4200: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
4210: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
4220: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
4230: 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  bName){.  Table 
4240: 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  *p;.  Db *pDb;..
4250: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
4260: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
4270: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
4280: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
4290: 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 74 65  zTabName );.  te
42a0: 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65  stcase( zTabName
42b0: 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65  [0]==0 );  /* Ze
42c0: 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20  ro-length table 
42d0: 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  names are allowe
42e0: 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  d */.  pDb = &db
42f0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20  ->aDb[iDb];.  p 
4300: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
4310: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
4320: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  a->tblHash, zTab
4330: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
4350: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
4360: 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73 71  abName),0);.  sq
4370: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
4380: 28 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  (p);.  db->flags
4390: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
43a0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
43b0: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
43c0: 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e  , return a strin
43d0: 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  g that consists 
43e0: 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  of the text of t
43f0: 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53  hat.** token.  S
4400: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
4410: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
4420: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
4430: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
4440: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
4450: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
4460: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
4470: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74  ..**.** Any quot
4480: 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a  ation marks (ex:
4490: 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27    "name", 'name'
44a0: 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61  , [name], or `na
44b0: 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72  me`) that.** sur
44c0: 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f  round the body o
44d0: 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20  f the token are 
44e0: 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  removed..**.** T
44f0: 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20  okens are often 
4500: 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  just pointers in
4510: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
4520: 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a  SQL text and so.
4530: 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20  ** are not \000 
4540: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61  terminated and a
4550: 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e  re not persisten
4560: 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  t.  The returned
4570: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30   string.** is \0
4580: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
4590: 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  d is persistent.
45a0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
45b0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73  3NameFromToken(s
45c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
45d0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
45e0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
45f0: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
4600: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
4610: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
4620: 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  )pName->z, pName
4630: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
4640: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
4650: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
4660: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
4670: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
4680: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
4690: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
46a0: 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74  le stored in dat
46b0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62  abase number iDb
46c0: 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e   for.** writing.
46d0: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70   The table is op
46e0: 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f  ened using curso
46f0: 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r 0..*/.void sql
4700: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
4710: 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e  ble(Parse *p, in
4720: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
4730: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
4740: 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  be(p);.  sqlite3
4750: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62  TableLock(p, iDb
4760: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31  , MASTER_ROOT, 1
4770: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
4780: 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Db));.  sqlite3V
4790: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
47a0: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41  OpenWrite, 0, MA
47b0: 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b  STER_ROOT, iDb);
47c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
47d0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
47e0: 68 61 72 20 2a 29 35 2c 20 50 34 5f 49 4e 54 33  har *)5, P4_INT3
47f0: 32 29 3b 20 20 2f 2a 20 35 20 63 6f 6c 75 6d 6e  2);  /* 5 column
4800: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20   table */.  if( 
4810: 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20  p->nTab==0 ){.  
4820: 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20    p->nTab = 1;. 
4830: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61   }.}../*.** Para
4840: 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e  meter zName poin
4850: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
4860: 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f  inated buffer co
4870: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
4880: 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61  e.** of a databa
4890: 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  se ("main", "tem
48a0: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
48b0: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
48c0: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
48d0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
48e0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
48f0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
4900: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20  b->aDb[], or.** 
4910: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
4920: 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  db cannot be fou
4930: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
4940: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c  e3FindDbName(sql
4950: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
4960: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4970: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20  int i = -1;     
4980: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4990: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20  number */.  if( 
49a0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20  zName ){.    Db 
49b0: 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20  *pDb;.    int n 
49c0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
49d0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
49e0: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
49f0: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
4a00: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
4a10: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
4a20: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  !OMIT_TEMPDB || 
4a30: 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c  i!=1 ) && n==sql
4a40: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
4a50: 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ->zName) && .   
4a60: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
4a70: 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e  3StrICmp(pDb->zN
4a80: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  ame, zName) ){. 
4a90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4aa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4ab0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
4ac0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
4ad0: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
4ae0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
4af0: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
4b00: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
4b10: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
4b20: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
4b30: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
4b40: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
4b50: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
4b60: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
4b70: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
4b80: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
4b90: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
4ba0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4bb0: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
4bc0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
4bd0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
4c00: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
4c10: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77         /* Name w
4c40: 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20  e are searching 
4c50: 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  for */.  zName =
4c60: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
4c70: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
4c80: 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46  ;.  i = sqlite3F
4c90: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e  indDbName(db, zN
4ca0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
4cb0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
4cc0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
4cd0: 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72  ./* The table or
4ce0: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
4cf0: 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20   name is passed 
4d00: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
4d10: 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e  via tokens.** pN
4d20: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
4d30: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
4d40: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
4d50: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
4d60: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ple:.**.** CREAT
4d70: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
4d80: 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68  (...);.** .** Th
4d90: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
4da0: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
4db0: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
4dc0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
4dd0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61  .** the table na
4de0: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
4df0: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
4e00: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4e10: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a  BLE yyy(...);.**
4e20: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
4e30: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
4e40: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
4e50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4e60: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70  tine sets the *p
4e70: 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20  pUnqual pointer 
4e80: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
4e90: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
4ea0: 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74  .** pName2) that
4eb0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
4ec0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
4ed0: 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  me.  The index o
4ee0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
4ef0: 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72  e "xxx" is retur
4f00: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
4f10: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a  te3TwoPartName(.
4f20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4f30: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
4f40: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
4f50: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
4f60: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
4f70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78        /* The "xx
4f80: 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  x" in the name "
4f90: 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78  xxx.yyy" or "xxx
4fa0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  " */.  Token *pN
4fb0: 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame2,      /* Th
4fc0: 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e  e "yyy" in the n
4fd0: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f  ame "xxx.yyy" */
4fe0: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
4ff0: 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  al     /* Write 
5000: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5010: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65  object name here
5020: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
5030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5040: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5050: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a   holding the obj
5060: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
5070: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5080: 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  b;..  if( ALWAYS
5090: 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26 20 70  (pName2!=0) && p
50a0: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20  Name2->n>0 ){.  
50b0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
50c0: 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71  usy ) {.      sq
50d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
50e0: 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64  arse, "corrupt d
50f0: 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20  atabase");.     
5100: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
5110: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
5120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
5130: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
5140: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
5150: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
5160: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
5170: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
5180: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5190: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
51a0: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
51b0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
51c0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
51d0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
51e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
51f0: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44  ert( db->init.iD
5200: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  b==0 || db->init
5210: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62  .busy );.    iDb
5220: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
5230: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
5240: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
5250: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
5260: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5270: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
5280: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
5290: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
52a0: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
52b0: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
52c0: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
52d0: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
52e0: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
52f0: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
5300: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
5310: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
5320: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
5330: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
5340: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
5350: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
5360: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
5370: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
5380: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
5390: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
53a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
53b0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
53c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
53d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
53e0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
53f0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
5400: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
5410: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
5420: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
5430: 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74  gs & SQLITE_Writ
5440: 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20  eSchema)==0.    
5450: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
5460: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d  te3StrNICmp(zNam
5470: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
5480: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5490: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
54a0: 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73  "object name res
54b0: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
54c0: 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61  al use: %s", zNa
54d0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
54e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
54f0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5500: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  E_OK;.}../*.** B
5510: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
5520: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
5530: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
5540: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
5550: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
5560: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
5570: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
5580: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
5590: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
55a0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
55b0: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
55c0: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
55d0: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
55e0: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
55f0: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
5600: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
5610: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
5620: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
5630: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
5640: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
5650: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
5660: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
5670: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
5680: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
5690: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
56a0: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
56b0: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
56c0: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
56d0: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
56e0: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
56f0: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
5700: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
5710: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
5720: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
5730: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
5740: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
5750: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
5760: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
5770: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
5780: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
5790: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
57a0: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
57b0: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
57c0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
57d0: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
57e0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
57f0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5800: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
5810: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
5820: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
5830: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
5840: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
5850: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
5860: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
5870: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
5880: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
5890: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
58a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
58b0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
58c0: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   First part of t
58d0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
58e0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
58f0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
5900: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
5910: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
5920: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5930: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
5940: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
5950: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
5960: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
5970: 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f  t isView,      /
5980: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5990: 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e  s a VIEW */.  in
59a0: 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f  t isVirtual,   /
59b0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
59c0: 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c  s a VIRTUAL tabl
59d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  e */.  int noErr
59e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
59f0: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
5a00: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
5a10: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
5a20: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
5a30: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
5a40: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
5a50: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
5a60: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5a70: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
5a80: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
5a90: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
5aa0: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
5ab0: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
5ac0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
5ad0: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
5ae0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
5af0: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
5b00: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
5b10: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20  or view name to 
5b20: 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64  create is passed
5b30: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5b40: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a   via tokens.  **
5b50: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5b60: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5b70: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5b80: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5b90: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
5ba0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5bb0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20  xx.yyy (...);.  
5bc0: 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e  ** .  ** Then pN
5bd0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5be0: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
5bf0: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
5c00: 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a  her hand if.  **
5c10: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5c20: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
5c30: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20  lified, i.e.:.  
5c40: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5c50: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20  ABLE yyy(...);. 
5c60: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e   **.  ** Then pN
5c70: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5c80: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5c90: 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  is ""..  **.  **
5ca0: 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20   The call below 
5cb0: 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70  sets the pName p
5cc0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5cd0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5ce0: 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61  ame1 or.  ** pNa
5cf0: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5d00: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5d10: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5d20: 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73   variable iDb is
5d30: 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  .  ** set to the
5d40: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
5d50: 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20  tabase that the 
5d60: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
5d70: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61   to be.  ** crea
5d80: 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ted in..  */.  i
5d90: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
5da0: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
5db0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
5dc0: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  &pName);.  if( i
5dd0: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
5de0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
5df0: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69  B && isTemp && i
5e00: 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Db>1 ){.    /* I
5e10: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
5e20: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
5e30: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
5e40: 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71  lified */.    sq
5e50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5e60: 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79  arse, "temporary
5e70: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74   table name must
5e80: 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22   be unqualified"
5e90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5ea0: 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54   }.  if( !OMIT_T
5eb0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5ec0: 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50  ) iDb = 1;..  pP
5ed0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
5ee0: 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61   = *pName;.  zNa
5ef0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5f00: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5f10: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
5f20: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
5f30: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
5f40: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
5f50: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
5f60: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
5f70: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
5f80: 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ror;.  }.  if( d
5f90: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
5fa0: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
5fb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5fc0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
5fd0: 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70   assert( (isTemp
5fe0: 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b   & 1)==isTemp );
5ff0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
6000: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  e;.    char *zDb
6010: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
6020: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
6030: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
6040: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
6050: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
6060: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
6070: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
6080: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6090: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
60a0: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
60b0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
60c0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
60d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
60e0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
60f0: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
6100: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
6110: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
6120: 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ATE_VIEW;.      
6130: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
6140: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
6150: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b  PDB && isTemp ){
6160: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
6170: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
6180: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
6190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
61a0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
61b0: 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ATE_TABLE;.     
61c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
61d0: 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73   !isVirtual && s
61e0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
61f0: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e  pParse, code, zN
6200: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
6210: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
6220: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6230: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
6240: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
6250: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d  he new table nam
6260: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69  e does not colli
6270: 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74  de with an exist
6280: 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  ing.  ** index o
6290: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20  r table name in 
62a0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
62b0: 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72  e.  Issue an err
62c0: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20  or message if.  
62d0: 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20  ** it does. The 
62e0: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20  exception is if 
62f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65  the statement be
6300: 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70  ing parsed was p
6310: 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e  assed.  ** to an
6320: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
6330: 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e  _vtab() call. In
6340: 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20   that case only 
6350: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
6360: 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20  .  ** and types 
6370: 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f  will be used, so
6380: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
6390: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61  d to test for na
63a0: 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c  mespace.  ** col
63b0: 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  lisions..  */.  
63c0: 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f  if( !IN_DECLARE_
63d0: 56 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28 20  VTAB ){.    if( 
63e0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
63f0: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
6400: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
6410: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6420: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6430: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
6440: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
6450: 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ame, db->aDb[iDb
6460: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ].zName);.    if
6470: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
6480: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
6490: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
64a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
64b0: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
64c0: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
64d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
64e0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
64f0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6500: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
6510: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
6520: 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44 62  e, 0)!=0 && (iDb
6530: 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74  ==0 || !db->init
6540: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20  .busy) ){.      
6550: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6560: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
6570: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
6580: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
6590: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
65a0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
65b0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
65c0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
65d0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
65e0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
65f0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
6600: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  0 ){.    db->mal
6610: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
6620: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
6630: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6640: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
6650: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
6660: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6670: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
6680: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
6690: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
66a0: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
66b0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
66c0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61  ].pSchema;.  pTa
66d0: 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ble->nRef = 1;. 
66e0: 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 20 3d   pTable->dbMem =
66f0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
6700: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
6710: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
6720: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
6730: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
6740: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
6750: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
6760: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
6770: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
6780: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
6790: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
67a0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
67b0: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
67c0: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
67d0: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
67e0: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
67f0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
6800: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6810: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
6820: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
6830: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
6840: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
6850: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  e")==0 ){.    pT
6860: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70  able->pSchema->p
6870: 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b  SeqTab = pTable;
6880: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
6890: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
68a0: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
68b0: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65   will insert the
68c0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e   table record in
68d0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  to.  ** the SQLI
68e0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
68f0: 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63    Note in partic
6900: 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73  ular that we mus
6910: 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20  t go ahead.  ** 
6920: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  and allocate the
6930: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
6940: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  or the table ent
6950: 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20  ry now.  Before 
6960: 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59  any.  ** PRIMARY
6970: 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b   KEY or UNIQUE k
6980: 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73  eywords are pars
6990: 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f  ed.  Those keywo
69a0: 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20  rds will cause. 
69b0: 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62   ** indices to b
69c0: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68  e created and th
69d0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d  e table record m
69e0: 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  ust come before 
69f0: 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  the .  ** indice
6a00: 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72  s.  Hence, the r
6a10: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
6a20: 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   the table must 
6a30: 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a  be allocated.  *
6a40: 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  * now..  */.  if
6a50: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
6a60: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33   && (v = sqlite3
6a70: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
6a80: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  !=0 ){.    int j
6a90: 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  1;.    int fileF
6aa0: 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72  ormat;.    int r
6ab0: 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b  eg1, reg2, reg3;
6ac0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
6ad0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
6ae0: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
6af0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6b00: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6b10: 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72  LE.    if( isVir
6b20: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
6b30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
6b40: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
6b50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
6b60: 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
6b70: 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64  format and encod
6b80: 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61 62  ing in the datab
6b90: 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  ase have not bee
6ba0: 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73  n set, .    ** s
6bb0: 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20  et them now..   
6bc0: 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70   */.    reg1 = p
6bd0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20  Parse->regRowid 
6be0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
6bf0: 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50 61  ;.    reg2 = pPa
6c00: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b  rse->regRoot = +
6c10: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
6c20: 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72     reg3 = ++pPar
6c30: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
6c40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6c50: 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
6c60: 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52  , iDb, reg3, BTR
6c70: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b  EE_FILE_FORMAT);
6c80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6c90: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
6ca0: 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  );.    j1 = sqli
6cb0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6cc0: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20   OP_If, reg3);. 
6cd0: 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20     fileFormat = 
6ce0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
6cf0: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
6d00: 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  t)!=0 ?.        
6d10: 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51            1 : SQ
6d20: 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f  LITE_MAX_FILE_FO
6d30: 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  RMAT;.    sqlite
6d40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6d50: 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46  P_Integer, fileF
6d60: 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20  ormat, reg3);.  
6d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6d80: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
6d90: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
6da0: 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67  FILE_FORMAT, reg
6db0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
6dc0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6dd0: 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29  Integer, ENC(db)
6de0: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
6df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6e00: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
6e10: 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f  iDb, BTREE_TEXT_
6e20: 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b  ENCODING, reg3);
6e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6e40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
6e50: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6e60: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6e70: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6e80: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6e90: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6ea0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6eb0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6ec0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
6ed0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
6ee0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
6ef0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
6f00: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
6f10: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
6f20: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
6f30: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6f40: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6f50: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
6f60: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
6f70: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
6f80: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
6f90: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
6fa0: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
6fb0: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
6fc0: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
6fd0: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
6fe0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
6ff0: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
7000: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
7010: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
7020: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
7030: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
7040: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7050: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
7060: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7070: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7080: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
7090: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
70a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
70b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
70c0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
70d0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
70e0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
70f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7100: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
7110: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
7120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7130: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
7140: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
7150: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7160: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
7170: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
7180: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7190: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
71a0: 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20  l, 0, reg3);.   
71b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
71c0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
71d0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
71e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
71f0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7200: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
7210: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7220: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
7230: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
7240: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
7250: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
7260: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
7270: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
7280: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
7290: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
72a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
72b0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
72c0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
72d0: 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  is macro is used
72e0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
72f0: 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73  strings in a cas
7300: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61  e-insensitive ma
7310: 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73  nner..** It is s
7320: 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
7330: 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  han calling sqli
7340: 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72  te3StrICmp() dir
7350: 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72  ectly, but.** pr
7360: 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f  oduces larger co
7370: 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  de..**.** WARNIN
7380: 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  G: This macro is
7390: 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20   not compatible 
73a0: 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28  with the strcmp(
73b0: 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20  ) family. It.** 
73c0: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
73d0: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  the two strings 
73e0: 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72  are equal, other
73f0: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
7400: 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78  define STRICMP(x
7410: 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55  , y) (\.sqlite3U
7420: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
7430: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78  signed char *)(x
7440: 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33  )]==   \.sqlite3
7450: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
7460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
7470: 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c  y)]     \.&& sql
7480: 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b  ite3StrICmp((x)+
7490: 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f  1,(y)+1)==0 )../
74a0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
74b0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
74c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
74d0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
74e0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
74f0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
7500: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
7510: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
7520: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
7530: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7540: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
7550: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
7560: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
7570: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
7580: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
7590: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
75a0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
75b0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
75c0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
75d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
75e0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
75f0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7600: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
7610: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
7620: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7630: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
7640: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7650: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
7660: 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  n;.#if SQLITE_MA
7670: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
7680: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
7690: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
76a0: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
76b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
76c0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
76d0: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
76e0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
76f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
7700: 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  dif.  z = sqlite
7710: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
7720: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
7730: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
7740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7750: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7760: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
7770: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
7780: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7790: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
77a0: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
77b0: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
77c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
77d0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
77e0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
77f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
7800: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
7810: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
7820: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
7830: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
7840: 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e  (db,p->aCol,(p->
7850: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
7860: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
7870: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
7880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
7890: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
78a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
78b0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
78c0: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
78d0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
78e0: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
78f0: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
7900: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
7910: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
7920: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7930: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
7940: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
7950: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
7960: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45  inity.  ** 'NONE
7970: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
7980: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
7990: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
79a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
79b0: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
79c0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
79d0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
79e0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
79f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
7a00: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
7a10: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a    p->nCol++;.}..
7a20: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7a30: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
7a40: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
7a50: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
7a60: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
7a70: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7a80: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
7a90: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
7aa0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
7ab0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
7ac0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
7ad0: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
7ae0: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
7af0: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
7b00: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
7b10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7b20: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
7b30: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
7b40: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
7b50: 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  *p;.  p = pParse
7b60: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
7b70: 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
7b80: 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65  (p->nCol<1) ) re
7b90: 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b  turn;.  p->aCol[
7ba0: 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75  p->nCol-1].notNu
7bb0: 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  ll = (u8)onError
7bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  ;.}../*.** Scan 
7bd0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
7be0: 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67  name zType (leng
7bf0: 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65  th nType) and re
7c00: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f  turn the.** asso
7c10: 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20  ciated affinity 
7c20: 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  type..**.** This
7c30: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
7c40: 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74  case-independent
7c50: 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65   search of zType
7c60: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62   for the .** sub
7c70: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66  strings in the f
7c80: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20  ollowing table. 
7c90: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  If one of the su
7ca0: 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66  bstrings is.** f
7cb0: 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73  ound, the corres
7cc0: 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79  ponding affinity
7cd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
7ce0: 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a   zType contains.
7cf0: 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
7d00: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
7d10: 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61  gs, entries towa
7d20: 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a  rd the top of .*
7d30: 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65  * the table take
7d40: 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65   priority. For e
7d50: 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65  xample, if zType
7d60: 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a   is 'BLOBINT', .
7d70: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  ** SQLITE_AFF_IN
7d80: 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65  TEGER is returne
7d90: 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69  d..**.** Substri
7da0: 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74  ng     | Affinit
7db0: 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y.** -----------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20  -----.** 'INT'  
7de0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7df0: 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27  AFF_INTEGER.** '
7e00: 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53  CHAR'        | S
7e10: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
7e20: 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'CLOB'        
7e30: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
7e40: 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20  T.** 'TEXT'     
7e50: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7e60: 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20  TEXT.** 'BLOB'  
7e70: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7e80: 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c  FF_NONE.** 'REAL
7e90: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7ea0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46  E_AFF_REAL.** 'F
7eb0: 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOA'        | SQ
7ec0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
7ed0: 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c   'DOUB'        |
7ee0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7ef0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f  .**.** If none o
7f00: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
7f10: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61   in the above ta
7f20: 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  ble are found,.*
7f30: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
7f40: 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64  ERIC is returned
7f50: 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
7f60: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f  3AffinityType(co
7f70: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a  nst char *zIn){.
7f80: 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63    u32 h = 0;.  c
7f90: 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45  har aff = SQLITE
7fa0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 0a 20  _AFF_NUMERIC;.. 
7fb0: 20 69 66 28 20 7a 49 6e 20 29 20 77 68 69 6c 65   if( zIn ) while
7fc0: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
7fd0: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
7fe0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
7ff0: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
8000: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
8010: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
8020: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
8030: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
8040: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
8050: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
8060: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a  LITE_AFF_TEXT; .
8070: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8080: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
8090: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
80a0: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
80b0: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
80c0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
80d0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
80e0: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
80f0: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
8100: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
8110: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
8120: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8130: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
8140: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
8150: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
8160: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
8170: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
8180: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
8190: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
81a0: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
81b0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
81c0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
81d0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23  LITE_AFF_NONE;.#
81e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
81f0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
8200: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
8210: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
8220: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
8230: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
8240: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
8250: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8260: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8270: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8280: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
8290: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
82a0: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
82b0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
82c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
82d0: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
82e0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
82f0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
8300: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8310: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
8320: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
8330: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
8340: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
8350: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
8360: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
8370: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8380: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
8390: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
83a0: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
83b0: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
83c0: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
83d0: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
83e0: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
83f0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8400: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
8410: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8420: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
8430: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
8440: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8450: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
8460: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
8470: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
8480: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
8490: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
84a0: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
84b0: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
84c0: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
84d0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
84e0: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
84f0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
8500: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
8510: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
8520: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
8530: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
8540: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
8550: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
8560: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
8570: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
8580: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
8590: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
85a0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
85b0: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
85c0: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
85d0: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
85e0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
85f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
8600: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
8610: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
8620: 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d  mn *pCol;..  p =
8630: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8640: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
8650: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
8660: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
8670: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
8680: 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73  ->nCol-1];.  ass
8690: 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  ert( pCol->zType
86a0: 3d 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  ==0 );.  pCol->z
86b0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Type = sqlite3Na
86c0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
86d0: 73 65 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a  se->db, pType);.
86e0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
86f0: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
8700: 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79  tyType(pCol->zTy
8710: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pe);.}../*.** Th
8720: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
8730: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
8740: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
8750: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
8760: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
8770: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
8780: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8790: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
87a0: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
87b0: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
87c0: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
87d0: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
87e0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
87f0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
8800: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8810: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8820: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8830: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8840: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8850: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
8860: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
8870: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
8880: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 53 70   *pParse, ExprSp
8890: 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61  an *pSpan){.  Ta
88a0: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
88b0: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
88c0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
88d0: 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  db;.  p = pParse
88e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
88f0: 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70  f( p!=0 ){.    p
8900: 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b  Col = &(p->aCol[
8910: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20  p->nCol-1]);.   
8920: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
8930: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
8940: 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78  ction(pSpan->pEx
8950: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
8960: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8970: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
8980: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
8990: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
89a0: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
89b0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
89c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
89d0: 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72   A copy of pExpr
89e0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
89f0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
8a00: 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61  , as pExpr conta
8a10: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b  ins.      ** tok
8a20: 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ens that point t
8a30: 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72  o volatile memor
8a40: 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66  y. The 'span' of
8a50: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
8a60: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
8a70: 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20 74  ired by pragma t
8a80: 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20  able_info..     
8a90: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8aa0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8ab0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
8ac0: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
8ad0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8ae0: 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70  (db, pSpan->pExp
8af0: 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  r, EXPRDUP_REDUC
8b00: 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  E);.      sqlite
8b10: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
8b20: 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->zDflt);.      
8b30: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71  pCol->zDflt = sq
8b40: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
8b50: 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d  b, (char*)pSpan-
8b60: 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20  >zStart,.       
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
8b90: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
8ba0: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
8bb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
8bc0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8bd0: 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70  (db, pSpan->pExp
8be0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
8bf0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
8c00: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
8c10: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
8c20: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
8c30: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
8c40: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
8c50: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
8c60: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
8c70: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
8c80: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
8c90: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
8ca0: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
8cb0: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
8cc0: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
8cd0: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
8ce0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
8cf0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
8d00: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
8d10: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
8d20: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
8d30: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
8d40: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
8d50: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
8d60: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
8d70: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
8d80: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
8d90: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
8da0: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
8db0: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
8dc0: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
8dd0: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
8de0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
8df0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
8e00: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
8e10: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
8e20: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
8e30: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
8e40: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
8e50: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
8e60: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
8e70: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8e80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
8e90: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
8ea0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8eb0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
8ec0: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
8ed0: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
8ee0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
8ef0: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
8f00: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
8f10: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
8f20: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
8f30: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8f40: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8f50: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8f60: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
8f70: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
8f80: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
8f90: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
8fa0: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
8fb0: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
8fc0: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
8fd0: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
8fe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8ff0: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
9000: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
9010: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
9020: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
9030: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
9040: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
9050: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
9060: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
9070: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
9080: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
9090: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
90a0: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49  if( pTab==0 || I
90b0: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
90c0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
90d0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
90e0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
90f0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
9100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9110: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
9120: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
9130: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
9140: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
9150: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
9160: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
9170: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
9180: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
9190: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
91a0: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
91b0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
91c0: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
91d0: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
91e0: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
91f0: 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 1;.  }else{
9200: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9210: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
9220: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
9230: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
9240: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
9250: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9260: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
9270: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
9280: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9290: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
92a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
92b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
92c0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
92d0: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
92e0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
92f0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
9300: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
9310: 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  }.    if( pList-
9320: 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20  >nExpr>1 ) iCol 
9330: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
9340: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
9350: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
9360: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
9370: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
9380: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70  ;.  }.  if( zTyp
9390: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
93a0: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
93b0: 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  GER")==0.       
93c0: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53   && sortOrder==S
93d0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a  QLITE_SO_ASC ){.
93e0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
93f0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
9400: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29  ->keyConf = (u8)
9410: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  onError;.    ass
9420: 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20  ert( autoInc==0 
9430: 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b  || autoInc==1 );
9440: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
9450: 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54  ags |= autoInc*T
9460: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  F_Autoincrement;
9470: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
9480: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
9490: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
94a0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
94b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
94c0: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
94d0: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
94e0: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
94f0: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
9500: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
9510: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
9520: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20  Index *p;.    p 
9530: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
9540: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
9550: 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45  0, 0, pList, onE
9560: 72 72 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74  rror, 0, 0, sort
9570: 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69  Order, 0);.    i
9580: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
9590: 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a  >autoIndex = 2;.
95a0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
95b0: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
95c0: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
95d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
95e0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
95f0: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
9600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
9610: 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74   new CHECK const
9620: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62  raint to the tab
9630: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
9640: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
9650: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9660: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
9670: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
9680: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
9690: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
96a0: 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72  Expr *pCheckExpr
96b0: 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65    /* The check e
96c0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
96d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
96e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e  pParse->db;.#ifn
96f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9700: 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70  CHECK.  Table *p
9710: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
9720: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9730: 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41  Tab && !IN_DECLA
9740: 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70  RE_VTAB ){.    p
9750: 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71  Tab->pCheck = sq
9760: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
9770: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
9780: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 65  CheckExpr);.  }e
9790: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
97a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
97b0: 6c 65 74 65 28 64 62 2c 20 70 43 68 65 63 6b 45  lete(db, pCheckE
97c0: 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  xpr);.  }.}../*.
97d0: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
97e0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66  tion function of
97f0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9800: 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20  ly parsed table 
9810: 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65  column.** to the
9820: 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a   CollSeq given..
9830: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
9840: 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  ddCollateType(Pa
9850: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
9860: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54  en *pToken){.  T
9870: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
9880: 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  ;.  char *zColl;
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98a0: 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f   Dequoted name o
98b0: 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
98c0: 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ence */.  sqlite
98d0: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  3 *db;..  if( (p
98e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
98f0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
9900: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
9910: 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  -1;.  db = pPars
9920: 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d  e->db;.  zColl =
9930: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
9940: 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e  Token(db, pToken
9950: 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  );.  if( !zColl 
9960: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
9970: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
9980: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
9990: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65  oll) ){.    Inde
99a0: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e  x *pIdx;.    p->
99b0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20  aCol[i].zColl = 
99c0: 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a  zColl;.  .    /*
99d0: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
99e0: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
99f0: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
9a00: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
9a10: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ",.    ** then a
9a20: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
9a30: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
9a40: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
9a50: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ore the.    ** c
9a60: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
9a70: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
9a80: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
9a90: 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  he case..    */.
9aa0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e      for(pIdx=p->
9ab0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
9ac0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
9ad0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9ae0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
9af0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
9b00: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
9b10: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  i ){.        pId
9b20: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70  x->azColl[0] = p
9b30: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[i].zColl;
9b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
9b60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
9b70: 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oll);.  }.}../*.
9b80: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9b90: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
9ba0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9bb0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
9bc0: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
9bd0: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
9be0: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
9bf0: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
9c00: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
9c10: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
9c20: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
9c30: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
9c40: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
9c50: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
9c60: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
9c70: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
9c80: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
9c90: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
9ca0: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
9cb0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
9cc0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
9cd0: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
9ce0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
9cf0: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
9d00: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
9d10: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
9d20: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
9d30: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
9d40: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
9d50: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
9d60: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
9d70: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
9d80: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
9d90: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
9da0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
9db0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
9dc0: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
9dd0: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
9de0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9df0: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
9e00: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
9e10: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
9e20: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
9e30: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
9e40: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
9e50: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
9e60: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
9e70: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
9e80: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
9e90: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ssage..**.** See
9ea0: 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69   also: sqlite3Fi
9eb0: 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c  ndCollSeq(), sql
9ec0: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29  ite3GetCollSeq()
9ed0: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
9ee0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
9ef0: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
9f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9f10: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
9f20: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9f30: 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28  .  u8 enc = ENC(
9f40: 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  db);.  u8 initbu
9f50: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
9f60: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
9f70: 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  Coll;..  pColl =
9f80: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
9f90: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
9fa0: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
9fb0: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
9fc0: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
9fd0: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
9fe0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
9ff0: 33 47 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20  3GetCollSeq(db, 
a000: 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  enc, pColl, zNam
a010: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  e);.    if( !pCo
a020: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
a030: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a040: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  se, "no such col
a050: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a  lation sequence:
a060: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
a070: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
a080: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
a090: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
a0a0: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
a0b0: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
a0c0: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
a0d0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
a0e0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
a0f0: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
a100: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
a110: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
a120: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
a130: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
a140: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
a150: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
a160: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
a170: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
a180: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
a190: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
a1a0: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
a1b0: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
a1c0: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
a1d0: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
a1e0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
a1f0: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
a200: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
a210: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
a220: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
a230: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
a240: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
a250: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
a260: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
a270: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
a280: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
a290: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
a2a0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
a2b0: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
a2c0: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
a2d0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
a2e0: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
a2f0: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
a300: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
a310: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
a320: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
a330: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
a340: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
a350: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
a360: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
a370: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
a380: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
a390: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
a3a0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a3b0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  rse);.  sqlite3 
a3c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a3d0: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
a3e0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73  arse->pVdbe;.  s
a3f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a400: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a410: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
a420: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
a430: 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71  kie+1, r1);.  sq
a440: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a450: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
a460: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
a470: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b  MA_VERSION, r1);
a480: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
a490: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a4a0: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   r1);.}../*.** M
a4b0: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
a4c0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
a4d0: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
a4e0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
a4f0: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
a500: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
a510: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
a520: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
a530: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
a540: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
a550: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
a560: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
a570: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
a580: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
a590: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
a5a0: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
a5b0: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
a5c0: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
a5d0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
a5e0: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
a5f0: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
a600: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
a610: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a620: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
a630: 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
a640: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
a650: 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75   to an output bu
a660: 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64  ffer. The second
a670: 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69   .** parameter i
a680: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
a690: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63  n integer that c
a6a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73  ontains the offs
a6b0: 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74  et at.** which t
a6c0: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
a6d0: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
a6e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
a6f0: 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d  pies the.** nul-
a700: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
a710: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
a720: 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65  the third parame
a730: 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e  ter, zSignedIden
a740: 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65  t,.** to the spe
a750: 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e  cified offset in
a760: 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20   the buffer and 
a770: 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f  updates *pIdx to
a780: 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65   refer.** to the
a790: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
a7a0: 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  r the last byte 
a7b0: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72  written before r
a7c0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a  eturning..** .**
a7d0: 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a   If the string z
a7e0: 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73  SignedIdent cons
a7f0: 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
a800: 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a   alpha-numeric.*
a810: 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f  * characters, do
a820: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
a830: 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73  h a digit and is
a840: 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77   not an SQL keyw
a850: 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ord,.** then it 
a860: 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  is copied to the
a870: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65   output buffer e
a880: 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e  xactly as it is.
a890: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69   Otherwise,.** i
a8a0: 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e  t is quoted usin
a8b0: 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e  g double-quotes.
a8c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a8d0: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
a8e0: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
a8f0: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
a900: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
a910: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
a920: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
a930: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
a940: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
a950: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20  .  i = *pIdx;.. 
a960: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
a970: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
a980: 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e  f( !sqlite3Isaln
a990: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
a9a0: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
a9b0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
a9c0: 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74  eedQuote = sqlit
a9d0: 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74  e3Isdigit(zIdent
a9e0: 5b 30 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b  [0]) || sqlite3K
a9f0: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
aa00: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20  t, j)!=TK_ID;.  
aa10: 69 66 28 20 21 6e 65 65 64 51 75 6f 74 65 20 29  if( !needQuote )
aa20: 7b 0a 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20  {.    needQuote 
aa30: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d  = zIdent[j];.  }
aa40: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
aa50: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
aa60: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
aa70: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
aa80: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
aa90: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
aaa0: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
aab0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
aac0: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
aad0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
aae0: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
aaf0: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
ab00: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
ab10: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
ab20: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
ab30: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
ab40: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
ab50: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
ab60: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
ab70: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
ab80: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
ab90: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
aba0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
abb0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
abc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
abd0: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
abe0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
abf0: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
ac00: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
ac10: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
ac20: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
ac30: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
ac40: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
ac50: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
ac60: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
ac70: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
ac80: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
ac90: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
aca0: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
acb0: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
acc0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
acd0: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
ace0: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
acf0: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
ad00: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
ad10: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
ad20: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
ad30: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
ad40: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
ad50: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
ad60: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
ad70: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
ad80: 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74  n );.  if( zStmt
ad90: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
ada0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
adb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
adc0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
add0: 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20  rintf(n, zStmt, 
ade0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29  "CREATE TABLE ")
adf0: 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53  ;.  k = sqlite3S
ae00: 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a  trlen30(zStmt);.
ae10: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
ae20: 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  , &k, p->zName);
ae30: 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20  .  zStmt[k++] = 
ae40: 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d  '(';.  for(pCol=
ae50: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
ae60: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
ae70: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69  ol++){.    stati
ae80: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
ae90: 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20  onst azType[] = 
aea0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  {.        /* SQL
aeb0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
aec0: 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20  */ " TEXT",.    
aed0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
aee0: 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22 2c  F_NONE    */ "",
aef0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
af00: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a  TE_AFF_NUMERIC *
af10: 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20  / " NUM",.      
af20: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
af30: 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54  INTEGER */ " INT
af40: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
af50: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20  LITE_AFF_REAL   
af60: 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20   */ " REAL".    
af70: 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  };.    int len;.
af80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
af90: 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69  zType;..    sqli
afa0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
afb0: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65  , &zStmt[k], zSe
afc0: 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c  p);.    k += sql
afd0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53  ite3Strlen30(&zS
afe0: 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65  tmt[k]);.    zSe
aff0: 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69  p = zSep2;.    i
b000: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
b010: 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  k, pCol->zName);
b020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
b030: 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49  l->affinity-SQLI
b040: 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20 30  TE_AFF_TEXT >= 0
b050: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
b060: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53  pCol->affinity-S
b070: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3c  QLITE_AFF_TEXT <
b080: 20 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 29 2f   sizeof(azType)/
b090: 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 5b 30 5d  sizeof(azType[0]
b0a0: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
b0b0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
b0c0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
b0d0: 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  XT );.    testca
b0e0: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
b0f0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty==SQLITE_AFF_N
b100: 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ONE );.    testc
b110: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
b120: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
b130: 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74  NUMERIC );.    t
b140: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
b150: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
b160: 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
b170: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
b180: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
b190: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a  ITE_AFF_REAL );.
b1a0: 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d      .    zType =
b1b0: 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66   azType[pCol->af
b1c0: 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f  finity - SQLITE_
b1d0: 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20 20 6c  AFF_TEXT];.    l
b1e0: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
b1f0: 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20  en30(zType);.   
b200: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
b210: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
b220: 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20  AFF_NONE .      
b230: 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61        || pCol->a
b240: 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33  ffinity==sqlite3
b250: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79  AffinityType(zTy
b260: 70 65 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  pe) );.    memcp
b270: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79  y(&zStmt[k], zTy
b280: 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20  pe, len);.    k 
b290: 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65  += len;.    asse
b2a0: 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a  rt( k<=n );.  }.
b2b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
b2c0: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
b2d0: 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a  ], "%s", zEnd);.
b2e0: 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a    return zStmt;.
b2f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b300: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
b310: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
b320: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
b330: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
b340: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b350: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
b360: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
b370: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
b380: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
b390: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
b3a0: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
b3b0: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
b3c0: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
b3d0: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
b3e0: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
b3f0: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
b400: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
b410: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
b420: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
b430: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
b440: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
b450: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
b460: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
b470: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
b480: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
b490: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
b4a0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
b4b0: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
b4c0: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
b4d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
b4e0: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
b4f0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
b500: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
b510: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
b520: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
b530: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
b540: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
b550: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b560: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
b570: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
b580: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
b590: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
b5a0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
b5b0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
b5c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
b5d0: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
b5e0: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
b5f0: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
b600: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
b610: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
b620: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
b630: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
b640: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
b650: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
b660: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
b670: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
b680: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
b690: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
b6a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
b6b0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
b6c0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
b6d0: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
b6e0: 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
b6f0: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
b700: 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
b710: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
b720: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
b730: 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69  inal ')' token i
b740: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
b750: 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  LE */.  Select *
b760: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
b770: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
b780: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
b790: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
b7a0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
b7b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b7c0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
b7d0: 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30  ..  if( (pEnd==0
b7e0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20   && pSelect==0) 
b7f0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
b800: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
b810: 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61  n;.  }.  p = pPa
b820: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
b830: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
b840: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
b850: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
b860: 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  | !pSelect );.. 
b870: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
b880: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
b890: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
b8a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b8b0: 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
b8c0: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
b8d0: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
b8e0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
b8f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
b900: 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c  heck ){.    SrcL
b910: 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20  ist sSrc;       
b920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b930: 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20  ake SrcList for 
b940: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b950: 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  e */.    NameCon
b960: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
b970: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
b980: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61   context for pPa
b990: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a  rse->pNewTable *
b9a0: 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  /..    memset(&s
b9b0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
b9c0: 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  C));.    memset(
b9d0: 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSrc, 0, sizeof
b9e0: 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72  (sSrc));.    sSr
b9f0: 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20  c.nSrc = 1;.    
ba00: 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20  sSrc.a[0].zName 
ba10: 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  = p->zName;.    
ba20: 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d  sSrc.a[0].pTab =
ba30: 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30   p;.    sSrc.a[0
ba40: 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
ba50: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
ba60: 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
ba70: 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72  .pSrcList = &sSr
ba80: 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65  c;.    sNC.isChe
ba90: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ck = 1;.    if( 
baa0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
bab0: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  prNames(&sNC, p-
bac0: 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20  >pCheck) ){.    
bad0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
bae0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
baf0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bb00: 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20  IT_CHECK) */..  
bb10: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
bb20: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
bb30: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
bb40: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
bb50: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
bb60: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
bb70: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
bb80: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
bb90: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
bba0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
bbb0: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
bbc0: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
bbd0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
bbe0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
bbf0: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
bc00: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
bc10: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
bc20: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
bc30: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
bc40: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
bc50: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
bc60: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
bc70: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70  it.busy ){.    p
bc80: 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
bc90: 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  t.newTnum;.  }..
bca0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
bcb0: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
bcc0: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
bcd0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
bce0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
bcf0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
bd00: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
bd10: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
bd20: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
bd30: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
bd40: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
bd50: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
bd60: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
bd70: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
bd80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
bd90: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
bda0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
bdb0: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
bdc0: 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *v;.    char *zT
bdd0: 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77  ype;    /* "view
bde0: 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a  " or "table" */.
bdf0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32      char *zType2
be00: 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72  ;   /* "VIEW" or
be10: 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20   "TABLE" */.    
be20: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20  char *zStmt;    
be30: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43  /* Text of the C
be40: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43  REATE TABLE or C
be50: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
be60: 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d  ment */..    v =
be70: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
be80: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
be90: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
bea0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
beb0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
bec0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a   OP_Close, 0);..
bed0: 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49      /* .    ** I
bee0: 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
bef0: 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77  for the new view
bf00: 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a   or table..    *
bf10: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
bf20: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
bf30: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
bf40: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
bf50: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
bf60: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
bf70: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
bf80: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
bf90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bfa0: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
bfb0: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
bfc0: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
bfd0: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
bfe0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
bff0: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
c000: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
c010: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
c020: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
c030: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
c040: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
c050: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
c060: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
c070: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
c080: 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65  w table is in re
c090: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
c0a0: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20  egRoot..    **. 
c0b0: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
c0c0: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
c0d0: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
c0e0: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
c0f0: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
c100: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
c110: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
c120: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
c130: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
c140: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
c150: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
c160: 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63   ** A shared-cac
c170: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73  he write-lock is
c180: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
c190: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65   write to the ne
c1a0: 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  w table,.    ** 
c1b0: 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  as a schema-lock
c1c0: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
c1d0: 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  dy been obtained
c1e0: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53   to create it. S
c1f0: 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63  ince.    ** a sc
c200: 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64  hema-lock exclud
c210: 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74  es all other dat
c220: 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65  abase users, the
c230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c   write-lock woul
c240: 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75  d.    ** be redu
c250: 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndant..    */.  
c260: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
c270: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
c280: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 54 61  t dest;.      Ta
c290: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a 20  ble *pSelTab;.. 
c2a0: 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72       assert(pPar
c2b0: 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20  se->nTab==1);.  
c2c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c2d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
c2e0: 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65  Write, 1, pParse
c2f0: 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b  ->regRoot, iDb);
c300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c310: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
c320: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
c330: 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
c340: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
c350: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
c360: 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20  _Table, 1);.    
c370: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
c380: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
c390: 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73   &dest);.      s
c3a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c3b0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29  (v, OP_Close, 1)
c3c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
c3d0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
c3e0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d         pSelTab =
c3f0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
c400: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
c410: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
c420: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
c430: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
c440: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c450: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
c460: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
c470: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
c480: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
c490: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
c4a0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
c4b0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
c4c0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
c4d0: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
c4e0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53  e3DeleteTable(pS
c4f0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  elTab);.      }.
c500: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
c510: 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
c520: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
c530: 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
c540: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
c550: 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
c560: 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
c570: 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  tmt(db, p);.    
c580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d  }else{.      n =
c590: 20 28 69 6e 74 29 28 70 45 6e 64 2d 3e 7a 20 2d   (int)(pEnd->z -
c5a0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
c5b0: 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  ken.z) + 1;.    
c5c0: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
c5d0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20  3MPrintf(db, .  
c5e0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
c5f0: 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32  %s %.*s", zType2
c600: 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61  , n, pParse->sNa
c610: 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20  meToken.z.      
c620: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c630: 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20   A slot for the 
c640: 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61  record has alrea
c650: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
c660: 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  d in the .    **
c670: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
c680: 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e  able.  We just n
c690: 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  eed to update th
c6a0: 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c  at slot with all
c6b0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f  .    ** the info
c6c0: 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f  rmation we've co
c6d0: 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  llected..    */.
c6e0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
c6f0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
c700: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
c710: 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
c720: 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
c730: 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
c740: 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  %Q, rootpage=#%d
c750: 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20  , sql=%Q ".     
c760: 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23    "WHERE rowid=#
c770: 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  %d",.      db->a
c780: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
c790: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
c7a0: 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20  ,.      zType,. 
c7b0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
c7c0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
c7d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
c7e0: 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d  Root,.      zStm
c7f0: 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t,.      pParse-
c800: 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b  >regRowid.    );
c810: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
c820: 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20  ee(db, zStmt);. 
c830: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
c840: 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
c850: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
c860: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
c870: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43  CREMENT.    /* C
c880: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
c890: 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
c8a0: 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65   an sqlite_seque
c8b0: 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20  nce table for.  
c8c0: 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61    ** keeping tra
c8d0: 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d  ck of autoincrem
c8e0: 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f  ent keys..    */
c8f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46  .    if( p->tabF
c900: 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
c910: 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  crement ){.     
c920: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
c930: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20  aDb[iDb];.      
c940: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
c950: 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
c960: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
c970: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
c980: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
c990: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
c9a0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
c9b0: 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
c9c0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20      pDb->zName. 
c9d0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
c9e0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
c9f0: 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
ca00: 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
ca10: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
ca20: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
ca30: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
ca40: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
ca50: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
ca60: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
ca70: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
ca80: 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71  b, "tbl_name='%q
ca90: 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34  '",p->zName), P4
caa0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a  _DYNAMIC);.  }..
cab0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
cac0: 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
cad0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
cae0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
caf0: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
cb00: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
cb10: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
cb20: 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
cb30: 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
cb40: 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73  ma;.    pOld = s
cb50: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
cb60: 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  (&pSchema->tblHa
cb70: 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  sh, p->zName,.  
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb90: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
cba0: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e  e3Strlen30(p->zN
cbb0: 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20 69 66 28  ame),p);.    if(
cbc0: 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
cbd0: 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
cbe0: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
cbf0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
cc00: 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
cc10: 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d  ) */.      db->m
cc20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
cc30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
cc40: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
cc50: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
cc60: 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b      db->nTable++
cc70: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
cc80: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
cc90: 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65  Changes;..#ifnde
cca0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
ccb0: 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
ccc0: 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
ccd0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
cce0: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
ccf0: 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
cd00: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
cd10: 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
cd20: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
cd30: 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
cd40: 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
cd50: 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
cd60: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
cd70: 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
cd80: 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
cd90: 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72  int)((const char
cda0: 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
cdb0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ame);.      p->a
cdc0: 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
cdd0: 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
cde0: 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
cdf0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
ce00: 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
ce10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
ce20: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
ce30: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
ce40: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
ce50: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
ce60: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
ce70: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
ce80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ce90: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
cea0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ceb0: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
cec0: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
ced0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
cee0: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
cef0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
cf00: 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
cf10: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
cf20: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
cf30: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
cf40: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
cf50: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
cf60: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
cf70: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
cf80: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
cf90: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
cfa0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
cfb0: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
cfc0: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
cfd0: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
cfe0: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
cff0: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
d000: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
d010: 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
d020: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
d030: 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
d040: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
d050: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
d060: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d070: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
d080: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
d090: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
d0a0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
d0b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d0c0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
d0d0: 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
d0e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d0f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
d100: 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
d110: 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
d120: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
d130: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
d140: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
d150: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
d160: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
d170: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
d180: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
d190: 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
d1a0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
d1b0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
d1c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
d1d0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
d1e0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
d1f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
d200: 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
d210: 3d 30 20 29 3b 20 2f 2a 20 49 66 20 73 71 6c 69  =0 ); /* If sqli
d220: 74 65 33 53 74 61 72 74 54 61 62 6c 65 20 72 65  te3StartTable re
d230: 74 75 72 6e 20 6e 6f 6e 2d 4e 55 4c 4c 20 74 68  turn non-NULL th
d240: 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 2a 2a 20 74 68 65 72 65 20 63 6f 75 6c 64 20 6e  ** there could n
d270: 6f 74 20 68 61 76 65 20 62 65 65 6e 20 61 6e 20  ot have been an 
d280: 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  error */.  sqlit
d290: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
d2a0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
d2b0: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
d2c0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
d2d0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
d2e0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69  p->pSchema);.  i
d2f0: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
d300: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
d310: 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
d320: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
d330: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
d340: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
d350: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
d360: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d370: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
d380: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
d390: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
d3a0: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
d3b0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
d3c0: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
d3d0: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
d3e0: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
d3f0: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
d400: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
d410: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
d420: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
d430: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
d440: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
d450: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
d460: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
d470: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
d480: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
d490: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
d4a0: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
d4b0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
d4c0: 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
d4d0: 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
d4e0: 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  E);.  sqlite3Sel
d4f0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d500: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62  elect);.  if( db
d510: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d520: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
d530: 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  }.  if( !db->ini
d540: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71  t.busy ){.    sq
d550: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
d560: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
d570: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  p);.  }..  /* Lo
d580: 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20  cate the end of 
d590: 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  the CREATE VIEW 
d5a0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65  statement.  Make
d5b0: 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20   sEnd point to. 
d5c0: 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a   ** the end..  *
d5d0: 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73  /.  sEnd = pPars
d5e0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20  e->sLastToken;. 
d5f0: 20 69 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64   if( ALWAYS(sEnd
d600: 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e  .z[0]!=0) && sEn
d610: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
d620: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
d630: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
d640: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e  n = 0;.  n = (in
d650: 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67  t)(sEnd.z - pBeg
d660: 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42  in->z);.  z = pB
d670: 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65  egin->z;.  while
d680: 28 20 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26  ( ALWAYS(n>0) &&
d690: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
d6a0: 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
d6b0: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
d6c0: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
d6d0: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
d6e0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
d6f0: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
d700: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
d710: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
d720: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
d730: 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
d740: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  , 0);.  return;.
d750: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d760: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
d770: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d780: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
d790: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
d7a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
d7b0: 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ABLE)./*.** The 
d7c0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
d7d0: 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
d7e0: 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
d7f0: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
d800: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
d810: 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
d820: 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
d830: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
d840: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
d850: 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
d860: 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
d870: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
d880: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
d890: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
d8a0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
d8b0: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
d8c0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
d8d0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65  e){.  Table *pSe
d8e0: 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b  lTab;   /* A fak
d8f0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69  e table from whi
d900: 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65  ch we get the re
d910: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65  sult set */.  Se
d920: 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
d930: 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53  /* Copy of the S
d940: 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65  ELECT that imple
d950: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a  ments the view *
d960: 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  /.  int nErr = 0
d970: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
d980: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
d990: 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  tered */.  int n
d9a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d9b0: 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64  Temporarily hold
d9c0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
d9d0: 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64  cursors assigned
d9e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
d9f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
da00: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
da10: 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c  nection for mall
da20: 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  oc errors */.  i
da30: 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69 64  nt (*xAuth)(void
da40: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
da50: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  *,const char*,co
da60: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
da70: 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72  char*);..  asser
da80: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69  t( pTable );..#i
da90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
daa0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
dab0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61 62   if( sqlite3Vtab
dac0: 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72  CallConnect(pPar
dad0: 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20  se, pTable) ){. 
dae0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
daf0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
db00: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
db10: 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
db20: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
db30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
db40: 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
db50: 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
db60: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
db70: 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
db80: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
db90: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
dba0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
dbb0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
dbc0: 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
dbd0: 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
dbe0: 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
dbf0: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
dc00: 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
dc10: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
dc20: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
dc30: 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
dc40: 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
dc50: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
dc60: 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
dc70: 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
dc80: 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
dc90: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
dca0: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
dcb0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
dcc0: 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
dcd0: 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
dce0: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
dcf0: 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
dd00: 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
dd10: 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
dd20: 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
dd30: 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
dd40: 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
dd50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
dd60: 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
dd70: 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
dd80: 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
dd90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
dda0: 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
ddb0: 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
ddc0: 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
ddd0: 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
dde0: 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
ddf0: 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
de00: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
de10: 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
de20: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
de30: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
de40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
de50: 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
de60: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
de70: 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
de80: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
de90: 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
dea0: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
deb0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
dec0: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
ded0: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
dee0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
def0: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
df00: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
df10: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
df20: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
df30: 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
df40: 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
df50: 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
df60: 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
df70: 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
df80: 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
df90: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
dfa0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
dfb0: 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
dfc0: 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
dfd0: 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
dfe0: 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
dff0: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
e000: 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
e010: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
e020: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
e030: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
e040: 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
e050: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
e060: 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
e070: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
e080: 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
e090: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
e0a0: 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 75 38  ( pSel ){.    u8
e0b0: 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65   enableLookaside
e0c0: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
e0d0: 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e  .bEnabled;.    n
e0e0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
e0f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
e100: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
e110: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
e120: 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Src);.    pTable
e130: 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
e140: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
e150: 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66  Enabled = 0;.#if
e160: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e170: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
e180: 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78     xAuth = db->x
e190: 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Auth;.    db->xA
e1a0: 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  uth = 0;.    pSe
e1b0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
e1c0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
e1d0: 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20  pParse, pSel);. 
e1e0: 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
e1f0: 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
e200: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
e210: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
e220: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29  ct(pParse, pSel)
e230: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 62 2d  ;.#endif.    db-
e240: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e250: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b  led = enableLook
e260: 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61 72 73  aside;.    pPars
e270: 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20  e->nTab = n;.   
e280: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
e290: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e2a0: 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
e2b0: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
e2c0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
e2d0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  Col;.      pTabl
e2e0: 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
e2f0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->aCol;.      p
e300: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
e310: 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
e320: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
e330: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
e340: 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20  ble(pSelTab);.  
e350: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
e360: 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42  ema->flags |= DB
e370: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
e380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e390: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
e3a0: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
e3b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e3c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
e3d0: 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73  , pSel);.  } els
e3e0: 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
e3f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
e400: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
e410: 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  /.  return nErr;
e420: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
e430: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e440: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
e450: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e460: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
e470: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
e480: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
e490: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
e4a0: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
e4b0: 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
e4c0: 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
e4d0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
e4e0: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
e4f0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
e500: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
e510: 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  i;.  if( !DbHasP
e520: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
e530: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
e540: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
e550: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
e560: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
e570: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
e580: 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48  sh); i;i=sqliteH
e590: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
e5a0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
e5b0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
e5c0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
e5d0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
e5e0: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
e5f0: 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20  mnNames(pTab);. 
e600: 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65     }.  }.  DbCle
e610: 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
e620: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
e630: 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ews);.}.#else.# 
e640: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65  define sqliteVie
e650: 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23  wResetAll(A,B).#
e660: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e670: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a  OMIT_VIEW */../*
e680: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
e690: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
e6a0: 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73  he VDBE to adjus
e6b0: 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
e6c0: 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79  chema.** used by
e6d0: 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65   SQLite when the
e6e0: 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76   btree layer mov
e6f0: 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20  es a table root 
e700: 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f  page. The.** roo
e710: 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t-page of a tabl
e720: 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61  e or index in da
e730: 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63  tabase iDb has c
e740: 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f  hanged from iFro
e750: 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a  m.** to iTo..**.
e760: 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a  ** Ticket #1728:
e770: 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62    The symbol tab
e780: 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63  le might still c
e790: 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  ontain informati
e7a0: 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20  on.** on tables 
e7b0: 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74  and/or indices t
e7c0: 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63  hat are the proc
e7d0: 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c  ess of being del
e7e0: 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20  eted..** If you 
e7f0: 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65  are unlucky, one
e800: 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65   of those delete
e810: 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62  d indices or tab
e820: 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76  les might.** hav
e830: 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70  e the same rootp
e840: 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68  age number as th
e850: 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20  e real table or 
e860: 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a  index that is.**
e870: 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53   being moved.  S
e880: 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70  o we cannot stop
e890: 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72   searching after
e8a0: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
e8b0: 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65   .** because the
e8c0: 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67   first match mig
e8d0: 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ht be for one of
e8e0: 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64   the deleted ind
e8f0: 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65  ices.** or table
e900: 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61  s and not the ta
e910: 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69  ble/index that i
e920: 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  s actually being
e930: 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75   moved..** We mu
e940: 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70  st continue loop
e950: 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61  ing until all ta
e960: 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
e970: 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67   with.** rootpag
e980: 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65  e==iFrom have be
e990: 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  en converted to 
e9a0: 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20  have a rootpage 
e9b0: 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64  of iTo.** in ord
e9c0: 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e  er to be certain
e9d0: 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65   that we got the
e9e0: 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23   right one..*/.#
e9f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ea00: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f  IT_AUTOVACUUM.vo
ea10: 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61  id sqlite3RootPa
ea20: 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c  geMoved(Db *pDb,
ea30: 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
ea40: 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iTo){.  HashElem
ea50: 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
ea60: 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68  *pHash;..  pHash
ea70: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
ea80: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72  ->tblHash;.  for
ea90: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
eaa0: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
eab0: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
eac0: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
ead0: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
eae0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
eaf0: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
eb00: 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
eb10: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
eb20: 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
eb30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48  ;.    }.  }.  pH
eb40: 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
eb50: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
eb60: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
eb70: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
eb80: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
eb90: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
eba0: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
ebb0: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
ebc0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
ebd0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
ebe0: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
ebf0: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
ec00: 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iTo;.    }.  }.}
ec10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
ec20: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
ec30: 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
ec40: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
ec50: 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
ec60: 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
ec70: 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
ec80: 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
ec90: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
eca0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
ecb0: 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
ecc0: 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
ecd0: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
ece0: 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
ecf0: 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
ed00: 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
ed10: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
ed20: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
ed30: 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
ed40: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
ed50: 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
ed60: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
ed70: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
ed80: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
ed90: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
eda0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
edb0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
edc0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
edd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ede0: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
edf0: 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
ee00: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
ee10: 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
ee20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ee30: 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
ee40: 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
ee50: 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
ee60: 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
ee70: 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
ee80: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
ee90: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
eea0: 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
eeb0: 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
eec0: 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
eed0: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
eee0: 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
eef0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
ef00: 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
ef10: 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
ef20: 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
ef30: 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
ef40: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
ef50: 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
ef60: 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
ef70: 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
ef80: 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
ef90: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
efa0: 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
efb0: 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
efc0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
efd0: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
efe0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
eff0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
f000: 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
f010: 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
f020: 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
f030: 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
f040: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
f050: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
f060: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
f070: 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
f080: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
f090: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f0a0: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
f0b0: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
f0c0: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
f0d0: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
f0e0: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
f0f0: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
f100: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
f110: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f120: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
f130: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
f140: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
f150: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
f160: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
f170: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
f180: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
f190: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
f1a0: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
f1b0: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
f1c0: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
f1d0: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
f1e0: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
f1f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
f200: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
f210: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
f220: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
f230: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
f240: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
f250: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
f260: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
f270: 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
f280: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
f290: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
f2a0: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
f2b0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
f2c0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
f2d0: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
f2e0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
f2f0: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
f300: 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
f310: 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
f320: 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
f330: 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
f340: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
f350: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
f360: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
f370: 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
f380: 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
f390: 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
f3a0: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
f3b0: 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
f3c0: 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
f3d0: 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
f3e0: 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
f3f0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
f400: 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
f410: 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
f420: 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
f430: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
f440: 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
f450: 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
f460: 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
f470: 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
f480: 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
f490: 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
f4a0: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
f4b0: 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
f4c0: 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
f4d0: 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
f4e0: 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
f4f0: 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
f500: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
f510: 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
f520: 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
f530: 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
f540: 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
f550: 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
f560: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
f570: 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
f580: 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
f590: 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
f5a0: 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
f5b0: 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
f5c0: 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
f5d0: 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
f5e0: 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
f5f0: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
f600: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
f610: 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
f620: 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
f630: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
f640: 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
f650: 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
f660: 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
f670: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
f680: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
f690: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
f6a0: 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
f6b0: 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
f6c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
f6d0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
f6e0: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
f6f0: 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
f700: 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
f710: 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
f720: 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
f730: 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
f740: 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
f750: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
f760: 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
f770: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
f780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
f790: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
f7a0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
f7b0: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
f7c0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73  hema);.      des
f7d0: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
f7e0: 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
f7f0: 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
f800: 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
f810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
f820: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
f830: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
f840: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
f850: 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
f860: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
f870: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
f880: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
f890: 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
f8a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
f8b0: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
f8c0: 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
f8d0: 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
f8e0: 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
f8f0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
f900: 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
f910: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
f920: 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
f930: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f940: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
f950: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
f960: 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
f970: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
f980: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f990: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
f9a0: 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
f9b0: 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b  b->suppressErr++
f9c0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
f9d0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
f9e0: 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 0a 20  arse, isView, . 
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa00: 20 20 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65             pName
fa10: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
fa20: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
fa30: 61 73 65 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72  ase);.  if( noEr
fa40: 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r ) db->suppress
fa50: 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54  Err--;..  if( pT
fa60: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  ab==0 ){.    got
fa70: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
fa80: 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  e;.  }.  iDb = s
fa90: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
faa0: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
fab0: 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
fac0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
fad0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a  db->nDb );..  /*
fae0: 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
faf0: 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c  rtual table, cal
fb00: 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  l ViewGetColumnN
fb10: 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65  ames() to ensure
fb20: 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74  .  ** it is init
fb30: 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
fb40: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
fb50: 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69  ab) && sqlite3Vi
fb60: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
fb70: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
fb80: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
fb90: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
fba0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fbb0: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
fbc0: 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
fbd0: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
fbe0: 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
fbf0: 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
fc00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
fc10: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
fc20: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
fc30: 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20  t char *zArg2 = 
fc40: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
fc50: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
fc60: 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
fc70: 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
fc80: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
fc90: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
fca0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
fcb0: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
fcc0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
fcd0: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
fce0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
fcf0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
fd00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fd10: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
fd20: 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
fd30: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
fd40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
fd50: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
fd60: 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
fd70: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
fd80: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
fd90: 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  P_VTABLE;.      
fda0: 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47  zArg2 = sqlite3G
fdb0: 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
fdc0: 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  b)->pMod->zName;
fdd0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
fde0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
fdf0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
fe00: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
fe10: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
fe20: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
fe30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fe40: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
fe50: 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
fe60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
fe70: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
fe80: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
fe90: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
fea0: 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
feb0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
fec0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
fed0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
fee0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
fef0: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
ff00: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
ff10: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
ff20: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
ff30: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
ff40: 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
ff50: 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
ff60: 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
ff70: 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
ff80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ff90: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
ffa0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
ffb0: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
ffc0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
ffd0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
ffe0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
fff0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
10000 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
10010 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
10020 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
10030 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
10040 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
10050 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
10060 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
10070 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
10080 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10090 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
100a0 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
100b0 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
100c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
100d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
100e0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
100f0 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
10100 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
10110 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10120 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
10130 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
10140 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
10150 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
10160 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
10170 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
10180 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
10190 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
101a0 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
101b0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
101c0 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
101d0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
101e0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
101f0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
10200 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
10210 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
10220 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
10230 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
10240 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
10250 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
10260 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10270 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
10280 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
10290 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
102a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
102b0 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
102c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
102d0 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70     sqlite3FkDrop
102e0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
102f0 61 6d 65 2c 20 70 54 61 62 29 3b 0a 0a 20 20 20  ame, pTab);..   
10300 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
10310 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
10320 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
10330 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
10340 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65  ode.    ** is ge
10350 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
10360 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
10370 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
10380 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  /or.    ** sqlit
10390 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
103a0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
103b0 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
103c0 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c   sqlite3TriggerL
103d0 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
103e0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  );.    while( pT
103f0 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
10400 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
10410 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
10420 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
10430 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
10440 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
10450 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
10460 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f        sqlite3Dro
10470 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
10480 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  se, pTrigger);. 
10490 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
104a0 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
104b0 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
104c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
104d0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
104e0 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72   Remove any entr
104f0 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ies of the sqlit
10500 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
10510 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10520 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
10530 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
10540 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
10550 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
10560 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a  s dropped.    **
10570 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65   at the btree le
10580 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65  vel, in case the
10590 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
105a0 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a   table needs to.
105b0 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61      ** move as a
105c0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
105d0 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
105e0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
105f0 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ode)..    */.   
10600 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
10610 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
10620 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  rement ){.      
10630 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
10640 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
10650 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
10660 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %s.sqlite_sequen
10670 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
10680 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ",.        pDb->
10690 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
106a0 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
106b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
106c0 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
106d0 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
106e0 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
106f0 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
10700 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20  e.    ** table. 
10710 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
10720 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
10730 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
10740 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20  and deletes.    
10750 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
10760 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
10770 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
10780 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
10790 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f  being.    ** dro
107a0 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61  pped. Triggers a
107b0 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72  re handled seper
107c0 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20  ately because a 
107d0 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20  trigger can be. 
107e0 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e     ** created in
107f0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
10800 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
10810 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
10820 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61  ther.    ** data
10830 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
10840 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
10850 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
10860 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
10870 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
10880 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
10890 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
108a0 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
108b0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
108c0 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  (iDb), pTab->zNa
108d0 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  me);..    /* Dro
108e0 70 20 61 6e 79 20 73 74 61 74 69 73 74 69 63 73  p any statistics
108f0 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
10900 5f 73 74 61 74 31 20 74 61 62 6c 65 2c 20 69 66  _stat1 table, if
10910 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
10920 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
10930 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69  dTable(db, "sqli
10940 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61  te_stat1", db->a
10950 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29  Db[iDb].zName) )
10960 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
10970 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10980 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
10990 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
109a0 65 5f 73 74 61 74 31 20 57 48 45 52 45 20 74 62  e_stat1 WHERE tb
109b0 6c 3d 25 51 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d  l=%Q", pDb->zNam
109c0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
109d0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
109e0 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26     if( !isView &
109f0 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
10a00 62 29 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74  b) ){.      dest
10a10 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
10a20 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20   pTab);.    }.. 
10a30 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
10a40 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f   table entry fro
10a50 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72  m SQLite's inter
10a60 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d  nal schema and m
10a70 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65  odify.    ** the
10a80 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
10a90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
10aa0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
10ab0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10ac0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10ad0 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
10ae0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
10af0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
10b00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b10 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  4(v, OP_DropTabl
10b20 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  e, iDb, 0, 0, pT
10b30 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
10b40 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
10b50 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
10b60 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
10b70 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
10b80 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
10b90 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
10ba0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
10bb0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
10bc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10bd0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
10be0 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
10bf0 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
10c00 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
10c10 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
10c20 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
10c30 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
10c40 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
10c50 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
10c60 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
10c70 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
10c80 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
10c90 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
10ca0 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
10cb0 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
10cc0 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
10cd0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
10ce0 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
10cf0 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
10d00 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
10d10 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
10d20 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
10d30 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
10d40 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
10d50 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
10d60 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
10d70 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
10d80 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
10d90 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
10da0 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
10db0 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
10dc0 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
10dd0 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
10de0 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
10df0 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
10e00 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
10e10 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
10e20 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
10e30 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
10e40 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ble field..**.**
10e50 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
10e60 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
10e70 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
10e80 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
10e90 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
10ea0 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
10eb0 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
10ec0 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
10ed0 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
10ee0 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
10ef0 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
10f00 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
10f10 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10f20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
10f30 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
10f40 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
10f50 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
10f60 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
10f70 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
10f80 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
10f90 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
10fa0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10fb0 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
10fc0 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
10fd0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
10fe0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
10ff0 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
11000 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
11010 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  hms. */.){.  sql
11020 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11030 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
11040 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
11050 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
11060 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79  FKey = 0;.  FKey
11070 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62   *pNextTo;.  Tab
11080 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
11090 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
110a0 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
110b0 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
110c0 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
110d0 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
110e0 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  f( p==0 || IN_DE
110f0 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
11100 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
11110 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
11120 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
11130 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
11140 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29   NEVER(iCol<0) )
11150 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11160 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
11170 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
11180 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11190 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
111a0 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
111b0 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
111c0 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
111d0 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
111e0 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
111f0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
11200 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
11210 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
11220 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
11230 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
11240 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
11250 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
11260 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
11270 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11280 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
11290 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
112a0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
112b0 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
112c0 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
112d0 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
112e0 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
112f0 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
11300 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
11310 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
11320 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
11330 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
11340 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
11350 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31  pFKey) + (nCol-1
11360 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  )*sizeof(pFKey->
11370 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
11380 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
11390 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
113a0 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
113b0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
113c0 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
113d0 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
113e0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
113f0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
11400 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62  FKey = sqlite3Db
11410 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
11420 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
11430 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  Key==0 ){.    go
11440 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
11450 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
11460 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
11470 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
11480 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
11490 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c  pFKey->aCol[nCol
114a0 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  ];.  pFKey->zTo 
114b0 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
114c0 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
114d0 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
114e0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
114f0 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70  ote(z);.  z += p
11500 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
11510 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
11520 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
11530 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
11540 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
11550 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
11560 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
11570 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11580 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
11590 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
115a0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
115b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
115c0 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
115d0 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
115e0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
115f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
11600 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
11610 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
11620 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11630 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11640 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
11650 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11660 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11670 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
11680 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
11690 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
116a0 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
116b0 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
116c0 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
116d0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
116e0 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
116f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11700 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
11710 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
11720 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
11730 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
11740 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
11750 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
11760 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
11770 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
11780 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
11790 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
117a0 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
117b0 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
117c0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
117d0 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
117e0 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  ;.  pFKey->aActi
117f0 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61  on[0] = (u8)(fla
11800 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20  gs & 0xff);     
11810 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c         /* ON DEL
11820 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ETE action */.  
11830 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31  pFKey->aAction[1
11840 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20  ] = (u8)((flags 
11850 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20  >> 8 ) & 0xff); 
11860 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20     /* ON UPDATE 
11870 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 70 4e 65  action */..  pNe
11880 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73  xtTo = (FKey *)s
11890 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
118a0 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b  (&p->pSchema->fk
118b0 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70  eyHash, .      p
118c0 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71 6c 69 74  FKey->zTo, sqlit
118d0 65 33 53 74 72 6c 65 6e 33 30 28 70 46 4b 65 79  e3Strlen30(pFKey
118e0 2d 3e 7a 54 6f 29 2c 20 28 76 6f 69 64 20 2a 29  ->zTo), (void *)
118f0 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28  pFKey.  );.  if(
11900 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20   pNextTo==pFKey 
11910 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
11920 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
11930 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11940 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20  }.  if( pNextTo 
11950 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
11960 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d  NextTo->pPrevTo=
11970 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 );.    pFKey-
11980 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74  >pNextTo = pNext
11990 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d  To;.    pNextTo-
119a0 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79  >pPrevTo = pFKey
119b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
119c0 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
119d0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73   to the table as
119e0 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a   the last step..
119f0 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20    */.  p->pFKey 
11a00 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79  = pFKey;.  pFKey
11a10 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20   = 0;..fk_end:. 
11a20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11a30 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  b, pFKey);.#endi
11a40 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
11a50 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
11a60 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
11a70 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
11a80 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b  e(db, pFromCol);
11a90 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
11aa0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  stDelete(db, pTo
11ab0 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
11ac0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
11ad0 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e  alled when an IN
11ae0 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
11af0 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44  E or INITIALLY D
11b00 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73  EFERRED.** claus
11b10 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72  e is seen as par
11b20 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b  t of a foreign k
11b30 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  ey definition.  
11b40 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a  The isDeferred.*
11b50 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31  * parameter is 1
11b60 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44   for INITIALLY D
11b70 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f  EFERRED and 0 fo
11b80 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  r INITIALLY IMME
11b90 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65  DIATE..** The be
11ba0 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f  havior of the mo
11bb0 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
11bc0 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ted foreign key 
11bd0 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
11be0 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76  ccordingly..*/.v
11bf0 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72  oid sqlite3Defer
11c00 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
11c10 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
11c20 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64  Deferred){.#ifnd
11c30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
11c40 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62  OREIGN_KEY.  Tab
11c50 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
11c60 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
11c70 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
11c80 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
11c90 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
11ca0 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
11cb0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44  n;.  assert( isD
11cc0 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73  eferred==0 || is
11cd0 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f  Deferred==1 ); /
11ce0 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31  * EV: R-30323-21
11cf0 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  917 */.  pFKey->
11d00 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38  isDeferred = (u8
11d10 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e  )isDeferred;.#en
11d20 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
11d30 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
11d40 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
11d50 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
11d60 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
11d70 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
11d80 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
11d90 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
11da0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
11db0 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
11dc0 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
11dd0 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
11de0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
11df0 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
11e00 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
11e10 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
11e20 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
11e30 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67  reated.  The reg
11e40 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20  ister specified 
11e50 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63  by memRootPage c
11e60 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72  ontains the.** r
11e70 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
11e80 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  of the index.  I
11e90 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
11ea0 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a   negative, then.
11eb0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  ** the index alr
11ec0 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20  eady exists and 
11ed0 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20  must be cleared 
11ee0 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66  before being ref
11ef0 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  illed and.** the
11f00 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
11f10 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
11f20 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e  s taken from pIn
11f30 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74  dex->tnum..*/.st
11f40 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
11f50 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72  3RefillIndex(Par
11f60 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
11f70 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d  x *pIndex, int m
11f80 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54  emRootPage){.  T
11f90 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
11fa0 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
11fb0 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
11fc0 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
11fd0 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
11fe0 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
11ff0 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
12000 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
12010 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
12020 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
12030 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
12040 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
12050 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
12060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12070 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12080 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
12090 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20  /.  int tnum;   
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
120c0 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64  of index */.  Vd
120d0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
120f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
12100 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  to this virtual 
12110 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79  machine */.  Key
12120 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20  Info *pKey;     
12130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
12140 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78  eyInfo for index
12150 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 64 78   */.  int regIdx
12160 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
12170 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
12180 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  s containing the
12190 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
121a0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
121c0 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
121d0 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69 6e  ng assemblied in
121e0 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
121f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
12200 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f  arse->db;      /
12210 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
12220 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
12230 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
12240 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
12250 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
12260 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
12270 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
12280 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c  ZATION.  if( sql
12290 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
122a0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49  arse, SQLITE_REI
122b0 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NDEX, pIndex->zN
122c0 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62  ame, 0,.      db
122d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
122e0 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   ) ){.    return
122f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
12300 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69  /* Require a wri
12310 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74  te-lock on the t
12320 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20  able to perform 
12330 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a  this operation *
12340 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  /.  sqlite3Table
12350 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
12360 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c  , pTab->tnum, 1,
12370 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
12380 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12390 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
123a0 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
123b0 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  n;.  if( memRoot
123c0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74  Page>=0 ){.    t
123d0 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67  num = memRootPag
123e0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
123f0 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
12400 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  num;.    sqlite3
12410 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12420 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
12430 62 29 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d  b);.  }.  pKey =
12440 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
12450 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 6e  info(pParse, pIn
12460 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dex);.  sqlite3V
12470 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12480 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
12490 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
124c0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
124d0 46 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  F);.  if( memRoo
124e0 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
124f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
12500 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 7d 0a 20  eP5(v, 1);.  }. 
12510 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
12520 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
12530 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
12540 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31  enRead);.  addr1
12550 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12560 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
12570 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 72  d, iTab, 0);.  r
12580 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
12590 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
125a0 72 73 65 29 3b 0a 20 20 72 65 67 49 64 78 4b 65  rse);.  regIdxKe
125b0 79 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65 72  y = sqlite3Gener
125c0 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
125d0 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62  se, pIndex, iTab
125e0 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b  , regRecord, 1);
125f0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
12600 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
12610 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
12620 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 49   regRowid = regI
12630 64 78 4b 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e  dxKey + pIndex->
12640 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e  nColumn;.    con
12650 73 74 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69  st int j2 = sqli
12660 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
12670 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 76  dr(v) + 2;.    v
12680 6f 69 64 20 2a 20 63 6f 6e 73 74 20 70 52 65 67  oid * const pReg
12690 4b 65 79 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  Key = SQLITE_INT
126a0 5f 54 4f 5f 50 54 52 28 72 65 67 49 64 78 4b 65  _TO_PTR(regIdxKe
126b0 79 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  y);..    /* The 
126c0 72 65 67 69 73 74 65 72 73 20 61 63 63 65 73 73  registers access
126d0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55  ed by the OP_IsU
126e0 6e 69 71 75 65 20 6f 70 63 6f 64 65 20 77 65 72  nique opcode wer
126f0 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  e allocated.    
12700 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ** using sqlite3
12710 47 65 74 54 65 6d 70 52 61 6e 67 65 28 29 20 69  GetTempRange() i
12720 6e 73 69 64 65 20 6f 66 20 74 68 65 20 73 71 6c  nside of the sql
12730 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
12740 78 4b 65 79 28 29 0a 20 20 20 20 2a 2a 20 63 61  xKey().    ** ca
12750 6c 6c 20 61 62 6f 76 65 2e 20 4a 75 73 74 20 62  ll above. Just b
12760 65 66 6f 72 65 20 74 68 61 74 20 66 75 6e 63 74  efore that funct
12770 69 6f 6e 20 77 61 73 20 66 72 65 65 64 20 74 68  ion was freed th
12780 65 79 20 77 65 72 65 20 72 65 6c 65 61 73 65 64  ey were released
12790 0a 20 20 20 20 2a 2a 20 28 6d 61 64 65 20 61 76  .    ** (made av
127a0 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 63  ailable to the c
127b0 6f 6d 70 69 6c 65 72 20 66 6f 72 20 72 65 75 73  ompiler for reus
127c0 65 29 20 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a  e) using .    **
127d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
127e0 65 6d 70 52 61 6e 67 65 28 29 2e 20 53 6f 20 69  empRange(). So i
127f0 6e 20 73 6f 6d 65 20 77 61 79 73 20 68 61 76 69  n some ways havi
12800 6e 67 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71  ng the OP_IsUniq
12810 75 65 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65  ue.    ** opcode
12820 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 73 20   use the values 
12830 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 73 65  stored within se
12840 65 6d 73 20 64 61 6e 67 65 72 6f 75 73 2e 20 48  ems dangerous. H
12850 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 0a 20 20  owever, since.  
12860 20 20 2a 2a 20 77 65 20 63 61 6e 20 62 65 20 73    ** we can be s
12870 75 72 65 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ure that no othe
12880 72 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73  r temp registers
12890 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
128a0 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 69 6e 63  ated.    ** sinc
128b0 65 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  e sqlite3Release
128c0 54 65 6d 70 52 61 6e 67 65 28 29 20 77 61 73 20  TempRange() was 
128d0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 73 61  called, it is sa
128e0 66 65 20 74 6f 20 64 6f 20 73 6f 2e 0a 20 20 20  fe to do so..   
128f0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
12900 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12910 49 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c 20  IsUnique, iIdx, 
12920 6a 32 2c 20 72 65 67 52 6f 77 69 64 2c 20 70 52  j2, regRowid, pR
12930 65 67 4b 65 79 2c 20 50 34 5f 49 4e 54 33 32 29  egKey, P4_INT32)
12940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c  ;.    sqlite3Hal
12950 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 20  tConstraint(.   
12960 20 20 20 20 20 70 50 61 72 73 65 2c 20 4f 45 5f       pParse, OE_
12970 41 62 6f 72 74 2c 20 22 69 6e 64 65 78 65 64 20  Abort, "indexed 
12980 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20  columns are not 
12990 75 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54  unique", P4_STAT
129a0 49 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  IC);.  }.  sqlit
129b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
129c0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
129d0 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
129e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
129f0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
12a00 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
12a10 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12a20 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12a30 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
12a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12a50 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
12a60 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71  , addr1+1);.  sq
12a70 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12a80 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73  e(v, addr1);.  s
12a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12aa0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
12ab0 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ab);.  sqlite3Vd
12ac0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
12ad0 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a  lose, iIdx);.}..
12ae0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
12af0 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
12b00 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
12b10 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
12b20 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
12b30 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
12b40 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
12b50 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
12b60 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
12b70 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
12b80 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
12b90 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
12ba0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
12bb0 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
12bc0 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
12bd0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
12be0 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
12bf0 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
12c00 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
12c10 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
12c20 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
12c30 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
12c40 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
12c50 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
12c60 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
12c70 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
12c80 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
12c90 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
12ca0 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
12cb0 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
12cc0 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
12cd0 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
12ce0 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
12cf0 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
12d00 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
12d10 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
12d20 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
12d30 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
12d40 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
12d50 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  tion.  .**.** If
12d60 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 72   the index is cr
12d70 65 61 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  eated successful
12d80 6c 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ly, return a poi
12d90 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
12da0 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74 75  Index.** structu
12db0 72 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  re. This is used
12dc0 20 62 79 20 73 71 6c 69 74 65 33 41 64 64 50 72   by sqlite3AddPr
12dd0 69 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d 61  imaryKey() to ma
12de0 72 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  rk the index.** 
12df0 61 73 20 74 68 65 20 74 61 62 6c 65 73 20 70 72  as the tables pr
12e00 69 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65 78  imary key (Index
12e10 2e 61 75 74 6f 49 6e 64 65 78 3d 3d 32 29 2e 0a  .autoIndex==2)..
12e20 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
12e30 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
12e40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12e50 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
12e60 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
12e70 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
12e80 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
12e90 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
12ea0 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
12eb0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
12ec0 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
12ed0 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
12ee0 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
12ef0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
12f00 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
12f10 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
12f20 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
12f30 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
12f40 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
12f50 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
12f60 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
12f70 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
12f80 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
12f90 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
12fa0 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
12fb0 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
12fc0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
12fd0 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
12fe0 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
12ff0 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73  at begins this s
13000 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
13010 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
13020 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
13030 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
13040 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
13050 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
13060 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f  Order,     /* So
13070 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d  rt order of prim
13080 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69  ary key when pLi
13090 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  st==NULL */.  in
130a0 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20  t ifNotExist    
130b0 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69   /* Omit error i
130c0 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  f index already 
130d0 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 49  exists */.){.  I
130e0 6e 64 65 78 20 2a 70 52 65 74 20 3d 20 30 3b 20  ndex *pRet = 0; 
130f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
13100 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 54 61  o return */.  Ta
13110 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
13120 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
13130 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
13140 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30  ndex *pIndex = 0
13150 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
13160 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
13170 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
13180 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  = 0;     /* Name
13190 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
131a0 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
131b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
131c0 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
131d0 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e  in zName */.  in
131e0 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20  t i, j;.  Token 
131f0 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 2f  nullId;        /
13200 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72  * Fake token for
13210 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73   an empty ID lis
13220 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73  t */.  DbFixer s
13230 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Fix;        /* F
13240 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
13250 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
13260 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  Table */.  int s
13270 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20  ortOrderMask;   
13280 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45  /* 1 to honor DE
13290 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20  SC in index.  0 
132a0 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20  to ignore. */.  
132b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
132c0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a  arse->db;.  Db *
132d0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
132e0 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
132f0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
13300 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61  g the indexed da
13310 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
13320 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
13330 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
13340 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
13350 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
13360 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
13370 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71  e = 0;    /* Unq
13380 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
13390 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
133a0 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  eate */.  struct
133b0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
133c0 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f  pListItem; /* Fo
133d0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
133e0 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  List */.  int nC
133f0 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  ol;.  int nExtra
13400 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45   = 0;.  char *zE
13410 78 74 72 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  xtra;..  assert(
13420 20 70 53 74 61 72 74 3d 3d 30 20 7c 7c 20 70 45   pStart==0 || pE
13430 6e 64 21 3d 30 20 29 3b 20 2f 2a 20 70 45 6e 64  nd!=0 ); /* pEnd
13440 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c   must be non-NUL
13450 4c 20 69 66 20 70 53 74 61 72 74 20 69 73 20 2a  L if pStart is *
13460 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
13470 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
13480 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c      /* Never cal
13490 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
134a0 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
134b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
134c0 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
134d0 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  AB ){.    goto e
134e0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
134f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
13500 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
13510 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
13520 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
13530 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13540 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
13550 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
13560 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
13570 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
13580 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
13590 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
135a0 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
135b0 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
135c0 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
135d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
135e0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
135f0 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
13600 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
13610 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
13620 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
13630 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
13640 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
13650 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
13660 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
13670 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
13680 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
13690 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
136a0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
136b0 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
136c0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
136d0 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e  ate_index;..#ifn
136e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
136f0 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
13700 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
13710 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
13720 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68   check if the th
13730 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
13740 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
13750 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
13760 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f  atabase to 1. Do
13770 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20   not do this.   
13780 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73   ** if initialis
13790 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73  ing a database s
137a0 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20  chema..    */.  
137b0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
137c0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54  busy ){.      pT
137d0 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
137e0 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
137f0 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20  , pTblName);.   
13800 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e     if( pName2->n
13810 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70  ==0 && pTab && p
13820 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  Tab->pSchema==db
13830 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
13840 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20   ){.        iDb 
13850 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
13860 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
13870 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
13880 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
13890 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
138a0 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
138b0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
138c0 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
138d0 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
138e0 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   /* Because the 
138f0 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74  parser construct
13900 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20  s pTblName from 
13910 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
13920 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71  ier,.      ** sq
13930 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20  lite3FixSrcList 
13940 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20  can never fail. 
13950 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
13960 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  0);.    }.    pT
13970 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
13980 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
13990 30 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  0, pTblName->a[0
139a0 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
139b0 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d    pTblName->a[0]
139c0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
139d0 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 64 62   if( !pTab || db
139e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
139f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13a00 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
13a10 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
13a20 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ].pSchema==pTab-
13a30 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65  >pSchema );.  }e
13a40 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
13a50 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
13a60 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   pTab = pParse->
13a70 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69  pNewTable;.    i
13a80 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
13a90 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13aa0 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  x;.    iDb = sql
13ab0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13ac0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
13ad0 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20  ema);.  }.  pDb 
13ae0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
13af0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
13b00 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
13b10 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
13b20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
13b30 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
13b40 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
13b50 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  , 7)==0 .       
13b60 26 26 20 6d 65 6d 63 6d 70 28 26 70 54 61 62 2d  && memcmp(&pTab-
13b70 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72  >zName[7],"alter
13b80 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20  tab_",9)!=0 ){. 
13b90 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13ba0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
13bb0 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
13bc0 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
13bd0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
13be0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13bf0 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
13c00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13c10 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
13c20 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
13c30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13c40 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
13c50 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
13c60 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13c70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13c80 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
13c90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13ca0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
13cb0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
13cc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13cd0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
13ce0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61  irtual tables ma
13cf0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
13d00 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
13d10 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13d20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13d30 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
13d40 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
13d50 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
13d60 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
13d70 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
13d80 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
13d90 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
13da0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
13db0 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
13dc0 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
13dd0 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
13de0 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
13df0 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
13e00 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
13e10 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
13e20 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
13e30 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
13e40 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
13e50 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
13e60 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
13e70 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
13e80 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
13e90 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
13ea0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
13eb0 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
13ec0 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
13ed0 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
13ee0 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
13ef0 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
13f00 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
13f10 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
13f20 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
13f30 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
13f40 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
13f50 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
13f60 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
13f70 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
13f80 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
13f90 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
13fa0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13fb0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
13fc0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
13fd0 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
13fe0 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
13ff0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14000 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14020 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
14030 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
14040 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
14050 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
14060 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14070 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14080 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
14090 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
140a0 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
140b0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
140c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
140d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
140e0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
140f0 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
14100 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  pDb->zName)!=0 )
14110 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e  {.      if( !ifN
14120 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20  otExist ){.     
14130 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14140 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
14150 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
14160 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
14170 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
14180 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14190 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
141a0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
141b0 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
141c0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
141d0 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
141e0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
141f0 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
14200 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
14210 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
14220 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
14230 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
14240 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
14250 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
14260 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
14270 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14280 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
14290 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
142a0 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
142b0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
142c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
142d0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
142e0 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
142f0 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
14300 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  >zName;.    if( 
14310 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14320 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14330 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
14340 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
14350 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
14360 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14370 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
14380 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
14390 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
143a0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
143b0 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
143c0 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
143d0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
143e0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
143f0 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
14400 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
14410 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
14420 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14430 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
14440 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
14450 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
14460 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
14470 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
14480 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
14490 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
144a0 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
144b0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
144c0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
144d0 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
144e0 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
144f0 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
14500 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
14510 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
14520 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
14530 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
14540 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  ame;.    nullId.
14550 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
14560 6e 33 30 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49  n30((char*)nullI
14570 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  d.z);.    pList 
14580 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
14590 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
145a0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
145b0 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
145c0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
145d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
145e0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
145f0 72 73 65 2c 20 70 4c 69 73 74 2c 20 26 6e 75 6c  rse, pList, &nul
14600 6c 49 64 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  lId, 0);.    pLi
14610 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
14620 65 72 20 3d 20 28 75 38 29 73 6f 72 74 4f 72 64  er = (u8)sortOrd
14630 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  er;.  }..  /* Fi
14640 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
14650 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  y bytes of space
14660 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
14670 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c   store explicitl
14680 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64  y.  ** specified
14690 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
146a0 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  nce names..  */.
146b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
146c0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
146d0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
146e0 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
146f0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
14700 78 70 72 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  xpr ){.      Col
14710 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 45  lSeq *pColl = pE
14720 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
14730 20 20 2f 2a 20 45 69 74 68 65 72 20 70 43 6f 6c    /* Either pCol
14740 6c 21 3d 30 20 6f 72 20 74 68 65 72 65 20 77 61  l!=0 or there wa
14750 73 20 61 6e 20 4f 4f 4d 20 66 61 69 6c 75 72 65  s an OOM failure
14760 2e 20 20 42 75 74 20 69 66 20 61 6e 20 4f 4f 4d  .  But if an OOM
14770 0a 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 75 72  .      ** failur
14780 65 20 77 65 20 68 61 76 65 20 71 75 69 74 20 62  e we have quit b
14790 65 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20 74  efore reaching t
147a0 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20  his point. */.  
147b0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
147c0 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  Coll) ){.       
147d0 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
147e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
147f0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  pColl->zName));.
14800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14810 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
14820 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
14830 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
14840 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
14850 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
14860 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69  e);.  nCol = pLi
14870 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
14880 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  dex = sqlite3DbM
14890 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20  allocZero(db, . 
148a0 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64 65       sizeof(Inde
148b0 78 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  x) +            
148c0 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
148d0 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 73  ture  */.      s
148e0 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20  izeof(int)*nCol 
148f0 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  +           /* I
14900 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
14910 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14920 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  int)*(nCol+1) + 
14930 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
14940 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20  iRowEst   */.   
14950 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a     sizeof(char *
14960 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
14970 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
14980 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a      */.      siz
14990 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20  eof(u8)*nCol +  
149a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
149b0 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
149c0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31  .      nName + 1
149d0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
149e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61      /* Index.zNa
149f0 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  me      */.     
14a00 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a20 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
14a30 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29  nce names */.  )
14a40 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
14a50 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14a60 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14a70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
14a80 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  ndex->azColl = (
14a90 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b  char**)(&pIndex[
14aa0 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  1]);.  pIndex->a
14ab0 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a  iColumn = (int *
14ac0 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  )(&pIndex->azCol
14ad0 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64  l[nCol]);.  pInd
14ae0 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28  ex->aiRowEst = (
14af0 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e  unsigned *)(&pIn
14b00 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
14b10 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ol]);.  pIndex->
14b20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
14b30 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52   *)(&pIndex->aiR
14b40 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a  owEst[nCol+1]);.
14b50 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
14b60 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
14b70 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ex->aSortOrder[n
14b80 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20  Col]);.  zExtra 
14b90 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
14ba0 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b  ex->zName[nName+
14bb0 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49  1]);.  memcpy(pI
14bc0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
14bd0 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
14be0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
14bf0 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
14c00 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
14c10 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
14c20 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
14c30 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
14c40 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
14c50 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a  (u8)(pName==0);.
14c60 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
14c70 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
14c80 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20  .pSchema;..  /* 
14c90 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
14ca0 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20  we should honor 
14cb0 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e  DESC requests on
14cc0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20   index columns. 
14cd0 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70   */.  if( pDb->p
14ce0 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
14cf0 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f  mat>=4 ){.    so
14d00 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31  rtOrderMask = -1
14d10 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53  ;   /* Honor DES
14d20 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  C */.  }else{.  
14d30 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
14d40 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72  = 0;    /* Ignor
14d50 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20  e DESC */.  }.. 
14d60 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
14d70 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
14d80 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
14d90 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
14da0 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
14db0 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
14dc0 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
14dd0 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
14de0 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
14df0 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
14e00 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20  ot found..  **. 
14e10 20 2a 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61   ** TODO:  Add a
14e20 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   test to make su
14e30 72 65 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  re that the same
14e40 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e   column is not n
14e50 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74  amed.  ** more t
14e60 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20  han once within 
14e70 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20  the same index. 
14e80 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
14e90 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a  instance of.  **
14ea0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c   the column will
14eb0 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79   ever be used by
14ec0 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
14ed0 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67   Note that using
14ee0 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63   the.  ** same c
14ef0 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20  olumn more than 
14f00 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61  once cannot be a
14f10 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
14f20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  that would .  **
14f30 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73   break backwards
14f40 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
14f50 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
14f60 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  a warning..  */.
14f70 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
14f80 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
14f90 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
14fa0 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
14fb0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
14fc0 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69   *zColName = pLi
14fd0 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  stItem->zName;. 
14fe0 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43     Column *pTabC
14ff0 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75  ol;.    int requ
15000 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
15010 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
15040 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
15050 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70  ..    for(j=0, p
15060 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
15070 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; j<pTab->nCol;
15080 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   j++, pTabCol++)
15090 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
150a0 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e  te3StrICmp(zColN
150b0 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e  ame, pTabCol->zN
150c0 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
150d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
150e0 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
150f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15100 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
15110 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63  able %s has no c
15120 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c  olumn named %s",
15130 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
15140 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b  Name, zColName);
15150 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
15160 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
15170 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
15180 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
15190 3b 0a 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69  ;.    /* Justifi
151a0 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 41 4c  cation of the AL
151b0 57 41 59 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e  WAYS(pListItem->
151c0 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 3a 20 20  pExpr->pColl):  
151d0 42 65 63 61 75 73 65 20 6f 66 0a 20 20 20 20 2a  Because of.    *
151e0 2a 20 74 68 65 20 77 61 79 20 74 68 65 20 22 69  * the way the "i
151f0 64 78 6c 69 73 74 22 20 6e 6f 6e 2d 74 65 72 6d  dxlist" non-term
15200 69 6e 61 6c 20 69 73 20 63 6f 6e 73 74 72 75 63  inal is construc
15210 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
15220 72 2c 0a 20 20 20 20 2a 2a 20 69 66 20 70 4c 69  r,.    ** if pLi
15230 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 69 73  stItem->pExpr is
15240 20 6e 6f 74 20 6e 75 6c 6c 20 74 68 65 6e 20 65   not null then e
15250 69 74 68 65 72 20 70 4c 69 73 74 49 74 65 6d 2d  ither pListItem-
15260 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 0a 20 20  >pExpr->pColl.  
15270 20 20 2a 2a 20 6d 75 73 74 20 65 78 69 73 74 20    ** must exist 
15280 6f 72 20 65 6c 73 65 20 74 68 65 72 65 20 6d 75  or else there mu
15290 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6e 20  st have been an 
152a0 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
152b0 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20  if there.    ** 
152c0 77 61 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  was an OOM error
152d0 2c 20 77 65 20 77 6f 75 6c 64 20 6e 65 76 65 72  , we would never
152e0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
152f0 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  t. */.    if( pL
15300 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 26  istItem->pExpr &
15310 26 20 41 4c 57 41 59 53 28 70 4c 69 73 74 49 74  & ALWAYS(pListIt
15320 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
15330 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ) ){.      int n
15340 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  Coll;.      zCol
15350 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  l = pListItem->p
15360 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61  Expr->pColl->zNa
15370 6d 65 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  me;.      nColl 
15380 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15390 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
153a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
153b0 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
153c0 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
153d0 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
153e0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
153f0 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
15400 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
15410 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
15420 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oll;.    }else{.
15430 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54        zColl = pT
15440 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
15450 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43  l;.      if( !zC
15460 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  oll ){.        z
15470 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
15480 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
15490 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
154a0 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
154b0 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63  y && !sqlite3Loc
154c0 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
154d0 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
154e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
154f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
15500 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
15510 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
15520 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
15530 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
15540 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
15550 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
15560 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
15570 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
15580 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
15590 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
155a0 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
155b0 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54  ndex);..  if( pT
155c0 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
155d0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
155e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
155f0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
15600 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
15610 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
15620 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
15630 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
15640 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
15650 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
15660 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
15670 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
15680 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
15690 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
156a0 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
156b0 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
156c0 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
156d0 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
156e0 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
156f0 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
15700 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
15710 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
15720 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
15730 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
15740 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
15750 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
15760 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
15770 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
15780 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
15790 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
157a0 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
157b0 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
157c0 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
157d0 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
157e0 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
157f0 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
15800 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
15810 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
15820 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49  wo UNIQUE or PRI
15830 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
15840 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ints are conside
15850 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20  red equivalent. 
15860 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20     ** (and thus 
15870 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20  suppressing the 
15880 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e  second one) even
15890 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69   if they have di
158a0 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73  fferent.    ** s
158b0 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20  ort orders..    
158c0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
158d0 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
158e0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
158f0 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63  nces or if the c
15900 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a  olumns of.    **
15910 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
15920 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65  occur in differe
15930 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20  nt orders, then 
15940 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  the constraints 
15950 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  are.    ** consi
15960 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61  dered distinct a
15970 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69  nd both result i
15980 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  n separate indic
15990 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
159a0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
159b0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
159c0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
159d0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
159e0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
159f0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
15a00 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
15a10 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
15a20 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  t( pIdx->autoInd
15a30 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ex );.      asse
15a40 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  rt( pIndex->onEr
15a50 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
15a60 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
15a70 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78  >nColumn!=pIndex
15a80 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
15a90 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
15aa0 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f  k=0; k<pIdx->nCo
15ab0 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  lumn; k++){.    
15ac0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15ad0 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
15ae0 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
15af0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
15b00 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
15b10 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
15b20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15b30 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
15b40 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32  l[k];.        z2
15b50 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
15b60 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
15b70 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69  ( z1!=z2 && sqli
15b80 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
15b90 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
15ba0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
15bb0 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
15bc0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
15bd0 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
15be0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
15bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
15c00 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
15c10 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
15c20 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
15c30 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
15c40 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
15c50 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
15c60 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
15c70 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
15c80 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
15c90 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
15ca0 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
15cb0 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
15cc0 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
15cd0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
15ce0 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
15cf0 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
15d00 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
15d10 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
15d20 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
15d30 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
15d40 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
15d50 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
15d60 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
15d70 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
15d80 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e  viour for the in
15d90 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
15da0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
15db0 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
15dc0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
15dd0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
15de0 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
15df0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15e00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15e10 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
15e20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
15e30 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
15e40 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
15e50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
15e60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
15e70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
15e80 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
15e90 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
15ea0 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
15eb0 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
15ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15ed0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
15ee0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
15ef0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15f00 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
15f10 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
15f20 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
15f30 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
15f40 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
15f50 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
15f60 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
15f70 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
15f80 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
15f90 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
15fa0 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64  HashInsert(&pInd
15fb0 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
15fc0 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fe0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
15ff0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16000 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a  pIndex->zName),.
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
16030 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
16040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
16050 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
16060 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
16070 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
16080 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16090 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
160a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
160b0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ex;.    }.    db
160c0 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
160d0 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
160e0 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
160f0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  e!=0 ){.      pI
16100 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d  ndex->tnum = db-
16110 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
16120 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
16130 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
16140 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72  usy is 0 then cr
16150 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  eate the index o
16160 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20  n disk.  This.  
16170 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74  ** involves writ
16180 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ing the index in
16190 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  to the master ta
161a0 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20  ble and filling 
161b0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
161c0 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  x with the curre
161d0 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  nt table content
161e0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
161f0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
16200 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65  s 0 when the use
16210 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61  r first enters a
16220 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20   CREATE INDEX . 
16230 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62   ** command.  db
16240 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
16250 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
16260 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a   is opened and .
16270 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
16280 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  X statements are
16290 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65   read out of the
162a0 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
162b0 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74  In.  ** the latt
162c0 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65  er case the inde
162d0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
162e0 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20   on disk, which 
162f0 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64  is why.  ** we d
16300 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63  on't want to rec
16310 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20  reate it..  **. 
16320 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d   ** If pTblName=
16330 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
16340 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
16350 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
16360 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
16370 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
16380 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
16390 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
163a0 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
163b0 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
163c0 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
163d0 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
163e0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
163f0 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
16400 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
16410 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ed..  */.  else{
16420 20 2f 2a 20 69 66 28 20 64 62 2d 3e 69 6e 69 74   /* if( db->init
16430 2e 62 75 73 79 3d 3d 30 20 29 20 2a 2f 0a 20 20  .busy==0 ) */.  
16440 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
16450 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20  har *zStmt;.    
16460 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
16470 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20  rse->nMem;..    
16480 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16490 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
164a0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
164b0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
164c0 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  x;...    /* Crea
164d0 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
164e0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
164f0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
16500 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
16510 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
16520 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
16530 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16540 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44  _CreateIndex, iD
16550 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f  b, iMem);..    /
16560 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d  * Gather the com
16570 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
16580 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
16590 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20  tatement into.  
165a0 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76    ** the zStmt v
165b0 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20  ariable.    */. 
165c0 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b     if( pStart ){
165d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
165e0 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  End!=0 );.      
165f0 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78  /* A named index
16600 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69   with an explici
16610 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  t CREATE INDEX s
16620 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
16630 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
16640 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52  3MPrintf(db, "CR
16650 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a  EATE%s INDEX %.*
16660 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72  s",.        onEr
16670 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22  ror==OE_None ? "
16680 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20  " : " UNIQUE",. 
16690 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d         pEnd->z -
166a0 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20   pName->z + 1,. 
166b0 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29         pName->z)
166c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
166d0 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74     /* An automat
166e0 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64  ic index created
166f0 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45   by a PRIMARY KE
16700 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  Y or UNIQUE cons
16710 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
16720 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  /* zStmt = sqlit
16730 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a  e3MPrintf(""); *
16740 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
16750 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
16760 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e   Add an entry in
16770 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66   sqlite_master f
16780 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20  or this index.  
16790 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
167a0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
167b0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e  se, .        "IN
167c0 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20  SERT INTO %Q.%s 
167d0 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25  VALUES('index',%
167e0 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a  Q,%Q,#%d,%Q);",.
167f0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
16800 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
16810 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
16820 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
16830 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54  Name,.        pT
16840 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
16850 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20     iMem,.       
16860 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
16870 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16880 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  db, zStmt);..   
16890 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
168a0 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
168b0 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
168c0 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
168d0 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
168e0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
168f0 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
16900 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
16910 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
16920 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16930 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
16940 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
16950 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
16960 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
16970 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
16980 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16990 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53  Op4(v, OP_ParseS
169a0 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
169b0 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
169c0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
169d0 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65  ame='%q'", pInde
169e0 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59  x->zName), P4_DY
169f0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71  NAMIC);.      sq
16a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16a10 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29  v, OP_Expire, 0)
16a20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16a30 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
16a40 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
16a50 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
16a60 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
16a70 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
16a80 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
16a90 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
16aa0 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
16ab0 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
16ac0 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
16ad0 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
16ae0 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61   correct constra
16af0 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70  int check.  ** p
16b00 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71  rocessing (in sq
16b10 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
16b20 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29  straintChecks())
16b30 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a   as part of.  **
16b40 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45   UPDATE and INSE
16b50 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  RT statements.  
16b60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
16b70 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
16b80 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
16b90 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
16ba0 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
16bb0 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
16bc0 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
16bd0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
16be0 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
16bf0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
16c00 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
16c10 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
16c20 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
16c30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
16c40 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
16c50 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
16c60 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
16c70 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
16c80 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
16c90 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
16ca0 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
16cb0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
16cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
16cd0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
16ce0 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
16cf0 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
16d00 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
16d10 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65      pRet = pInde
16d20 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20  x;.    pIndex = 
16d30 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  0;.  }..  /* Cle
16d40 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
16d50 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
16d60 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28  ate_index:.  if(
16d70 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
16d80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 64  qlite3_free(pInd
16d90 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  ex->zColAff);.  
16da0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16db0 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
16dc0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
16dd0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
16de0 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
16df0 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
16e00 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  pTblName);.  sql
16e10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
16e20 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
16e30 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pRet;.}../*.** F
16e40 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69  ill the Index.ai
16e50 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77  RowEst[] array w
16e60 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f  ith default info
16e70 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d  rmation - inform
16e80 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75  ation.** to be u
16e90 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65  sed when we have
16ea0 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41   not run the ANA
16eb0 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  LYZE command..**
16ec0 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20  .** aiRowEst[0] 
16ed0 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f  is suppose to co
16ee0 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
16ef0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
16f00 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69  the index..** Si
16f10 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  nce we do not kn
16f20 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c  ow, guess 1 mill
16f30 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31  ion.  aiRowEst[1
16f40 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
16f50 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
16f60 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
16f70 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63   table that matc
16f80 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
16f90 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
16fa0 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
16fb0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52   the index.  aiR
16fc0 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65  owEst[2] is an e
16fd0 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
16fe0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
16ff0 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
17000 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69  particular combi
17010 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  niation of the f
17020 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a  irst 2 columns.*
17030 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  * of the index. 
17040 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
17050 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  It must always b
17060 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
17070 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
17080 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f  iRowEst[N]<=aiRo
17090 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20  wEst[N-1].**    
170a0 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
170b0 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72  N]>=1.**.** Apar
170c0 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20  t from that, we 
170d0 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67  have little to g
170e0 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74  o on besides int
170f0 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20  uition as to.** 
17100 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73  how aiRowEst[] s
17110 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
17120 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ized.  The numbe
17130 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72  rs generated her
17140 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f  e.** are based o
17150 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73  n typical values
17160 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c   found in actual
17170 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69   indices..*/.voi
17180 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  d sqlite3Default
17190 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49  RowEst(Index *pI
171a0 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
171b0 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77  *a = pIdx->aiRow
171c0 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Est;.  int i;.  
171d0 61 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a  assert( a!=0 );.
171e0 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30    a[0] = 1000000
171f0 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e  ;.  for(i=pIdx->
17200 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69  nColumn; i>=5; i
17210 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  --){.    a[i] = 
17220 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  5;.  }.  while( 
17230 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d  i>=1 ){.    a[i]
17240 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20 20 20 69   = 11 - i;.    i
17250 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  --;.  }.  if( pI
17260 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
17270 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49  None ){.    a[pI
17280 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31  dx->nColumn] = 1
17290 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
172a0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
172b0 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
172c0 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
172d0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
172e0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
172f0 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
17300 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
17310 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
17320 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
17330 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
17340 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
17350 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
17360 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
17370 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17380 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
17390 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
173a0 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f  ->nErr==0 );   /
173b0 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
173c0 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
173d0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
173e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
173f0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17400 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
17410 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
17420 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
17430 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
17440 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
17450 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
17460 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
17470 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
17480 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
17490 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
174a0 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
174b0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
174c0 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
174d0 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
174e0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
174f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17500 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
17510 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
17520 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
17530 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
17540 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
17550 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
17560 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
17570 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
17580 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17590 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
175a0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
175b0 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
175c0 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
175d0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
175e0 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
175f0 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
17600 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
17610 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
17620 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
17630 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
17640 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
17650 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
17660 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
17670 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
17680 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
17690 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
176a0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
176b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
176c0 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
176d0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
176e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
176f0 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
17700 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
17710 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
17720 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
17730 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
17740 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
17750 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
17760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17770 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
17780 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
17790 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
177a0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
177b0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
177c0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
177d0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
177e0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
177f0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
17800 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
17810 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
17820 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17830 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
17840 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
17850 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
17860 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
17870 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
17880 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
17890 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
178a0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
178b0 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
178c0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
178d0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
178e0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
178f0 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
17900 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  Q",.       db->a
17910 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
17920 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
17930 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ,.       pIndex-
17940 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
17950 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
17960 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69  dTable(db, "sqli
17970 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61  te_stat1", db->a
17980 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29  Db[iDb].zName) )
17990 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
179a0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
179b0 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
179c0 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
179d0 65 5f 73 74 61 74 31 20 57 48 45 52 45 20 69 64  e_stat1 WHERE id
179e0 78 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 64  x=%Q",.        d
179f0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
17a00 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
17a10 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
17a20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
17a30 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
17a40 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f  iDb);.    destro
17a50 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
17a60 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
17a70 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
17a80 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17a90 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62  P_DropIndex, iDb
17aa0 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  , 0, 0, pIndex->
17ab0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
17ac0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
17ad0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
17ae0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
17af0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72  e);.}../*.** pAr
17b00 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
17b10 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
17b20 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f  objects.  Each o
17b30 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
17b40 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
17b50 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
17b60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
17b70 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  locates a new.**
17b80 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65   object on the e
17b90 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  nd of the array.
17ba0 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20  .**.** *pnEntry 
17bb0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
17bc0 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79   entries already
17bd0 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c   in use.  *pnAll
17be0 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65  oc is.** the pre
17bf0 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
17c00 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  d size of the ar
17c10 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69  ray.  initSize i
17c20 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74  s the.** suggest
17c30 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79  ed initial array
17c40 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e   size allocation
17c50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
17c60 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74  x of the new ent
17c70 72 79 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ry is returned i
17c80 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54  n *pIdx..**.** T
17c90 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
17ca0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
17cb0 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62   the array of ob
17cc0 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20  jects.  This.** 
17cd0 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
17ce0 65 20 61 73 20 74 68 65 20 70 41 72 72 61 79 20  e as the pArray 
17cf0 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20  parameter or it 
17d00 6d 69 67 68 74 20 62 65 20 61 20 64 69 66 66 65  might be a diffe
17d10 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rent.** pointer 
17d20 69 66 20 74 68 65 20 61 72 72 61 79 20 77 61 73  if the array was
17d30 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69   resized..*/.voi
17d40 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41  d *sqlite3ArrayA
17d50 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74  llocate(.  sqlit
17d60 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20  e3 *db,      /* 
17d70 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
17d80 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
17d90 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
17da0 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f  d *pArray,     /
17db0 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  * Array of objec
17dc0 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65  ts.  Might be re
17dd0 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
17de0 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20  nt szEntry,     
17df0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68   /* Size of each
17e00 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61   object in the a
17e10 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  rray */.  int in
17e20 69 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53  itSize,     /* S
17e30 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c  uggested initial
17e40 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20   allocation, in 
17e50 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
17e60 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20  t *pnEntry,     
17e70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  /* Number of obj
17e80 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ects currently i
17e90 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  n use */.  int *
17ea0 70 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20  pnAlloc,     /* 
17eb0 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
17ec0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  the allocation, 
17ed0 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  in elements */. 
17ee0 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20   int *pIdx      
17ef0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
17f00 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73  index of a new s
17f10 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lot here */.){. 
17f20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
17f30 2a 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41  *pnEntry >= *pnA
17f40 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64  lloc ){.    void
17f50 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *pNew;.    int 
17f60 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77  newSize;.    new
17f70 53 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63  Size = (*pnAlloc
17f80 29 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a  )*2 + initSize;.
17f90 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
17fa0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
17fb0 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a  pArray, newSize*
17fc0 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
17fd0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
17fe0 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
17ff0 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
18000 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ay;.    }.    *p
18010 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  nAlloc = sqlite3
18020 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
18030 20 70 4e 65 77 29 2f 73 7a 45 6e 74 72 79 3b 0a   pNew)/szEntry;.
18040 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65      pArray = pNe
18050 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68  w;.  }.  z = (ch
18060 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65  ar*)pArray;.  me
18070 6d 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79  mset(&z[*pnEntry
18080 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
18090 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
180a0 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  x = *pnEntry;.  
180b0 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
180c0 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
180d0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
180e0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
180f0 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
18100 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
18110 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
18120 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
18130 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
18140 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
18150 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
18160 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
18170 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71  3IdListAppend(sq
18180 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
18190 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
181a0 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20  *pToken){.  int 
181b0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
181c0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
181d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
181e0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
181f0 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
18200 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
18210 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
18220 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  t->nAlloc = 0;. 
18230 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
18240 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
18250 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
18260 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
18270 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
18280 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
18290 20 35 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74   5,.      &pList
182a0 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c  ->nId,.      &pL
182b0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20  ist->nAlloc,.   
182c0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28     &i.  );.  if(
182d0 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   i<0 ){.    sqli
182e0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
182f0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
18300 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
18310 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
18320 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
18330 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
18340 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ken);.  return p
18350 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
18360 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
18370 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18380 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  IdListDelete(sql
18390 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
183a0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
183b0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
183c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
183d0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
183e0 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
183f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18400 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
18410 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
18420 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
18430 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
18440 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
18450 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
18460 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
18470 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
18480 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
18490 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
184a0 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
184b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
184c0 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
184d0 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
184e0 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
184f0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
18500 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
18510 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
18520 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
18530 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18540 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
18550 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
18560 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
18570 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
18580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e  ;.}../*.** Expan
18590 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f  d the space allo
185a0 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69  cated for the gi
185b0 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65  ven SrcList obje
185c0 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e  ct by.** creatin
185d0 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f  g nExtra new slo
185e0 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ts beginning at 
185f0 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20  iStart.  iStart 
18600 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a  is zero based..*
18610 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20  * New slots are 
18620 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  zeroed..**.** Fo
18630 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f  r example, suppo
18640 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69  se a SrcList ini
18650 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20  tially contains 
18660 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42  two entries: A,B
18670 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33  ..** To append 3
18680 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74   new entries ont
18690 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68  o the end, do th
186a0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  is:.**.**    sql
186b0 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
186c0 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c  ge(db, pSrclist,
186d0 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66   3, 2);.**.** Af
186e0 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f  ter the call abo
186f0 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74  ve it would cont
18700 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c  ain:  A, B, nil,
18710 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66   nil, nil..** If
18720 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75   the iStart argu
18730 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20  ment had been 1 
18740 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68  instead of 2, th
18750 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  en the result.**
18760 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
18770 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  :  A, nil, nil, 
18780 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70  nil, B.  To prep
18790 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74  end the new slot
187a0 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74  s,.** the iStart
187b0 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20   value would be 
187c0 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74  0.  The result t
187d0 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a  hen would.** be:
187e0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
187f0 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  A, B..**.** If a
18800 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
18810 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63  on fails the Src
18820 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65  List is unchange
18830 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d  d.  The.** db->m
18840 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
18850 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
18860 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  true..*/.SrcList
18870 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
18880 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74  Enlarge(.  sqlit
18890 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a  e3 *db,       /*
188a0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
188b0 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
188c0 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a  f OOM errors */.
188d0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
188e0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c       /* The SrcL
188f0 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67  ist to be enlarg
18900 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
18910 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ra,        /* Nu
18920 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74  mber of new slot
18930 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63  s to add to pSrc
18940 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ->a[] */.  int i
18950 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a  Start         /*
18960 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e   Index in pSrc->
18970 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77  a[] of first new
18980 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e   slot */.){.  in
18990 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  t i;..  /* Sanit
189a0 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61  y checking on ca
189b0 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  lling parameters
189c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
189d0 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  tart>=0 );.  ass
189e0 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29  ert( nExtra>=1 )
189f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
18a00 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
18a10 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e   iStart<=pSrc->n
18a20 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  Src );..  /* All
18a30 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c  ocate additional
18a40 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64   space if needed
18a50 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
18a60 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
18a70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
18a80 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
18a90 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
18aa0 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
18ab0 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b  a;.    int nGot;
18ac0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
18ad0 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
18ae0 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
18af0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
18b00 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
18b10 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
18b20 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
18b30 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
18b40 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
18b50 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
18b60 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
18b70 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
18b80 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
18b90 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
18ba0 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
18bb0 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
18bc0 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
18bd0 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
18be0 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 31 36 29 6e  >nAlloc = (u16)n
18bf0 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Got;.  }..  /* M
18c00 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f  ove existing slo
18c10 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74  ts that come aft
18c20 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73  er the newly ins
18c30 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a  erted slots.  **
18c40 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20   out of the way 
18c50 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  */.  for(i=pSrc-
18c60 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61  >nSrc-1; i>=iSta
18c70 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53  rt; i--){.    pS
18c80 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20  rc->a[i+nExtra] 
18c90 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  = pSrc->a[i];.  
18ca0 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b  }.  pSrc->nSrc +
18cb0 3d 20 28 69 31 36 29 6e 45 78 74 72 61 3b 0a 0a  = (i16)nExtra;..
18cc0 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65    /* Zero the ne
18cd0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c  wly allocated sl
18ce0 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ots */.  memset(
18cf0 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d  &pSrc->a[iStart]
18d00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63  , 0, sizeof(pSrc
18d10 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b  ->a[0])*nExtra);
18d20 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b  .  for(i=iStart;
18d30 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61   i<iStart+nExtra
18d40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63  ; i++){.    pSrc
18d50 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
18d60 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   -1;.  }..  /* R
18d70 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
18d80 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20  to the enlarged 
18d90 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74  SrcList */.  ret
18da0 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a  urn pSrc;.}.../*
18db0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
18dc0 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
18dd0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
18de0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
18df0 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
18e00 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
18e10 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
18e20 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
18e30 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20  en if pTable is 
18e40 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72  NULL..**.** A Sr
18e50 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  cList is returne
18e60 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  d, or NULL if th
18e70 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72  ere is an OOM er
18e80 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ror.  The return
18e90 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69  ed.** SrcList mi
18ea0 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ght be the same 
18eb0 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  as the SrcList t
18ec0 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72  hat was input or
18ed0 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20   it might be.** 
18ee0 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61  a new one.  If a
18ef0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73  n OOM error does
18f00 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
18f10 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66  e prior value of
18f20 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69   pList.** that i
18f30 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20  s input to this 
18f40 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d  routine is autom
18f50 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a  atically freed..
18f60 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61  **.** If pDataba
18f70 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20  se is not null, 
18f80 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
18f90 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f  e table has an o
18fa0 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  ptional.** datab
18fb0 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e  ase name prefix.
18fc0 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64    Like this:  "d
18fd0 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20  atabase.table". 
18fe0 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a   The pDatabase.*
18ff0 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
19000 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74  table name and t
19010 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73  he pTable points
19020 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
19030 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72   name..** The Sr
19040 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  cList.a[].zName 
19050 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20  field is filled 
19060 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
19070 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a  ame which might.
19080 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61  ** come from pTa
19090 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73  ble (if pDatabas
190a0 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72  e is NULL) or fr
190b0 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a  om pDatabase.  .
190c0 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  ** SrcList.a[].z
190d0 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c  Database is fill
190e0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
190f0 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70  base name from p
19100 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74  Table,.** or wit
19110 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74  h NULL if no dat
19120 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69  abase is specifi
19130 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ed..**.** In oth
19140 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c  er words, if cal
19150 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  l like this:.**.
19160 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
19170 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
19180 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,0);.**.** 
19190 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
191a0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
191b0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
191c0 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
191d0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
191e0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
191f0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
19200 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43  stAppend(D,A,B,C
19210 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20  );.**.** Then C 
19220 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
19230 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64  e and B is the d
19240 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49  atabase name.  I
19250 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a  f C is defined.*
19260 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20  * then so is B. 
19270 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19280 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61   we never have a
19290 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a   case where:.**.
192a0 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
192b0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
192c0 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,0,C);.**.** 
192d0 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20  Both pTable and 
192e0 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73  pDatabase are as
192f0 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74  sumed to be quot
19300 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65  ed.  They are de
19310 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65  quoted.** before
19320 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20   being added to 
19330 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
19340 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
19350 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  SrcListAppend(. 
19360 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
19370 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
19380 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
19390 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
193a0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c  */.  SrcList *pL
193b0 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65  ist,     /* Appe
193c0 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69  nd to this SrcLi
193d0 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73  st. NULL creates
193e0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a   a new SrcList *
193f0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
19400 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  e,      /* Table
19410 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   to append */.  
19420 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
19430 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
19440 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
19450 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
19460 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
19470 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
19480 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c  base==0 || pTabl
19490 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  e!=0 );  /* Cann
194a0 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75  ot have C withou
194b0 74 20 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  t B */.  if( pLi
194c0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
194d0 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
194e0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
194f0 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a  eof(SrcList) );.
19500 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
19510 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
19520 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
19530 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20   1;.  }.  pList 
19540 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
19550 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73  Enlarge(db, pLis
19560 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72  t, 1, pList->nSr
19570 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  c);.  if( db->ma
19580 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
19590 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
195a0 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
195b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
195c0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
195d0 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
195e0 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
195f0 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
19600 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
19610 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
19620 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
19630 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b  abase ){.    Tok
19640 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
19650 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
19660 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
19670 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
19680 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
19690 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
196a0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
196b0 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65   pTable);.  pIte
196c0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73  m->zDatabase = s
196d0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
196e0 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73  ken(db, pDatabas
196f0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  e);.  return pLi
19700 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
19710 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69  ign VdbeCursor i
19720 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20  ndex numbers to 
19730 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
19740 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
19750 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
19760 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
19770 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
19780 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
19790 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
197a0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
197b0 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73  m;.  assert(pLis
197c0 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  t || pParse->db-
197d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
197e0 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
197f0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
19800 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
19810 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
19820 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19830 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72   if( pItem->iCur
19840 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sor>=0 ) break;.
19850 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75        pItem->iCu
19860 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
19870 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Tab++;.      if(
19880 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
19890 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
198a0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
198b0 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
198c0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
198d0 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Src);.      }.  
198e0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
198f0 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
19900 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64  e SrcList includ
19910 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73  ing all its subs
19920 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69  tructure..*/.voi
19930 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
19940 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
19950 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  db, SrcList *pLi
19960 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
19970 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
19980 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
19990 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
199a0 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  urn;.  for(pItem
199b0 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
199c0 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
199d0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
199e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
199f0 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  db, pItem->zData
19a00 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
19a10 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
19a20 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
19a30 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
19a40 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
19a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
19a60 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
19a70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
19a80 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
19a90 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
19aa0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
19ab0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
19ac0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
19ad0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
19ae0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
19af0 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
19b00 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
19b10 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
19b20 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
19b30 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
19b40 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
19b50 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
19b60 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
19b70 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
19b80 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
19b90 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
19ba0 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
19bb0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
19bc0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
19bd0 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
19be0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
19bf0 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
19c00 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
19c10 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
19c20 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
19c30 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
19c40 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
19c50 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
19c60 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
19c70 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
19c80 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
19c90 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
19ca0 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
19cb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
19cc0 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
19cd0 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
19ce0 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
19cf0 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
19d00 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c   alias, then pAl
19d10 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ias points to th
19d20 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e  e.** alias token
19d30 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69  .  If the term i
19d40 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68  s a subquery, th
19d50 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20  en pSubquery is 
19d60 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  the.** SELECT st
19d70 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  atement that the
19d80 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65   subquery encode
19d90 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61  s.  The pTable a
19da0 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20  nd.** pDatabase 
19db0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e  parameters are N
19dc0 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69  ULL for subqueri
19dd0 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64  es.  The pOn and
19de0 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d   pUsing.** param
19df0 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f  eters are the co
19e00 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20  ntent of the ON 
19e10 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
19e20 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
19e30 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68  a new SrcList wh
19e40 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74  ich encodes is t
19e50 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65  he FROM with the
19e60 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64   new.** term add
19e70 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  ed..*/.SrcList *
19e80 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
19e90 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20  pendFromTerm(.  
19ea0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19eb0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
19ec0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
19ed0 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20  SrcList *p,     
19ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
19ef0 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  eft part of the 
19f00 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65  FROM clause alre
19f10 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f  ady seen */.  To
19f20 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
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 74 61 62 6c 65 20 74 6f 20 61 64   the table to ad
19f50 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c  d to the FROM cl
19f60 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ause */.  Token 
19f70 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20  *pDatabase,     
19f80 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
19f90 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
19fa0 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20  ning pTable */. 
19fb0 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20   Token *pAlias, 
19fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19fd0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
19fe0 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70  of the AS subexp
19ff0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ression */.  Sel
1a000 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20  ect *pSubquery, 
1a010 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65       /* A subque
1a020 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  ry used in place
1a030 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
1a040 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c   */.  Expr *pOn,
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a060 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   The ON clause o
1a070 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64  f a join */.  Id
1a080 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20  List *pUsing    
1a090 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49        /* The USI
1a0a0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  NG clause of a j
1a0b0 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  oin */.){.  stru
1a0c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1a0d0 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
1a0e0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1a0f0 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20  db;.  if( !p && 
1a100 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20  (pOn || pUsing) 
1a110 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1a120 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1a130 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73  a JOIN clause is
1a140 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
1a150 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f   %s", .      (pO
1a160 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e  n ? "ON" : "USIN
1a170 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67  G").    );.    g
1a180 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
1a190 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d  error;.  }.  p =
1a1a0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1a1b0 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61  ppend(db, p, pTa
1a1c0 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
1a1d0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
1a1e0 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29  EVER(p->nSrc==0)
1a1f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70   ){.    goto app
1a200 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a  end_from_error;.
1a210 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
1a220 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
1a230 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73    assert( pAlias
1a240 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c  !=0 );.  if( pAl
1a250 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49  ias->n ){.    pI
1a260 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
1a270 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1a280 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a  en(db, pAlias);.
1a290 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65    }.  pItem->pSe
1a2a0 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79  lect = pSubquery
1a2b0 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d  ;.  pItem->pOn =
1a2c0 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70   pOn;.  pItem->p
1a2d0 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a  Using = pUsing;.
1a2e0 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70    return p;.. ap
1a2f0 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a  pend_from_error:
1a300 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
1a310 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1a320 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b  Delete(db, pOn);
1a330 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
1a340 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e  Delete(db, pUsin
1a350 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  g);.  sqlite3Sel
1a360 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
1a370 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75  ubquery);.  retu
1a380 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
1a390 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  dd an INDEXED BY
1a3a0 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   or NOT INDEXED 
1a3b0 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f  clause to the mo
1a3c0 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
1a3d0 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66  d .** element of
1a3e0 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
1a3f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1a400 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
1a410 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1a420 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28  rcListIndexedBy(
1a430 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1a440 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e  rcList *p, Token
1a450 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20   *pIndexedBy){. 
1a460 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65   assert( pIndexe
1a470 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  dBy!=0 );.  if( 
1a480 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e  p && ALWAYS(p->n
1a490 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74  Src>0) ){.    st
1a4a0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1a4b0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
1a4c0 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20  [p->nSrc-1];.   
1a4d0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1a4e0 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26  notIndexed==0 &&
1a4f0 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d   pItem->zIndex==
1a500 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
1a510 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
1a520 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
1a530 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
1a540 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
1a550 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
1a560 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
1a570 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
1a580 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
1a590 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
1a5a0 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49       pItem->notI
1a5b0 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20  ndexed = 1;.    
1a5c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
1a5d0 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c  em->zIndex = sql
1a5e0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1a5f0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  n(pParse->db, pI
1a600 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d  ndexedBy);.    }
1a610 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
1a620 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61  en building up a
1a630 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
1a640 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20  the parser, the 
1a650 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  join operator.**
1a660 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74   is initially at
1a670 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
1a680 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74  ft operand.  But
1a690 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1a6a0 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74  tor.** expects t
1a6b0 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1a6c0 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69   to be on the ri
1a6d0 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
1a6e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68  is routine.** Sh
1a6f0 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70  ifts all join op
1a700 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66  erators from lef
1a710 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61  t to right for a
1a720 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a  n entire FROM.**
1a730 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45   clause..**.** E
1a740 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20  xample: Suppose 
1a750 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65  the join is like
1a760 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1a770 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c         A natural
1a780 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a   cross join B.**
1a790 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72  .** The operator
1a7a0 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f   is "natural cro
1a7b0 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41  ss join".  The A
1a7c0 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20   and B operands 
1a7d0 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
1a7e0 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e   p->a[0] and p->
1a7f0 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65  a[1], respective
1a800 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ly.  The parser 
1a810 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73  initially stores
1a820 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72   the.** operator
1a830 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72   with A.  This r
1a840 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68  outine shifts th
1a850 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72  at operator over
1a860 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73   to B..*/.void s
1a870 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69  qlite3SrcListShi
1a880 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69  ftJoinType(SrcLi
1a890 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  st *p){.  if( p 
1a8a0 26 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69  && p->a ){.    i
1a8b0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1a8c0 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20  p->nSrc-1; i>0; 
1a8d0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i--){.      p->a
1a8e0 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  [i].jointype = p
1a8f0 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ->a[i-1].jointyp
1a900 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  e;.    }.    p->
1a910 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[0].jointype = 
1a920 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1a930 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
1a940 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1a950 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
1a960 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1a970 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
1a980 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
1a990 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
1a9a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1a9b0 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
1a9c0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
1a9d0 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f  sert( db!=0 );./
1a9e0 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30  *  if( db->aDb[0
1a9f0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
1aa00 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  n; */.  if( sqli
1aa10 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1aa20 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1aa30 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
1aa40 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
1aa50 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
1aa60 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1aa70 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
1aa80 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
1aa90 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
1aaa0 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
1aab0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1aac0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1aad0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1aae0 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
1aaf0 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
1ab00 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
1ab10 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
1ab20 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
1ab30 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1ab40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ab50 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
1ab60 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
1ab70 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
1ab80 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1ab90 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
1aba0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1abb0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1abc0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
1abd0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
1abe0 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
1abf0 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
1ac00 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20  t( db!=0 );./*  
1ac10 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  if( db->aDb[0].p
1ac20 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  Bt==0 ) return; 
1ac30 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1ac40 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1ac50 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1ac60 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
1ac70 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
1ac80 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
1ac90 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1aca0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1acb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1acc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1acd0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
1ace0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
1acf0 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1ad00 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1ad10 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
1ad20 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1ad30 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1ad40 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1ad50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1ad60 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
1ad70 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
1ad80 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1ad90 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /*  if( db->aDb[
1ada0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1adb0 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  rn; */.  if( sql
1adc0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1add0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1ade0 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
1adf0 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  ACK", 0, 0) ){. 
1ae00 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1ae10 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1ae20 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1ae30 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1ae40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ae50 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
1ae60 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
1ae70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ae80 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
1ae90 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69  he parser when i
1aea0 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61  t parses a comma
1aeb0 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a  nd to create,.**
1aec0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
1aed0 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65  back an SQL save
1aee0 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20  point. .*/.void 
1aef0 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74  sqlite3Savepoint
1af00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1af10 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70  int op, Token *p
1af20 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
1af30 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1af40 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1af50 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
1af60 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
1af70 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
1af80 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1af90 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
1afa0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1afb0 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69  ZATION.    stati
1afc0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
1afd0 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42  onst az[] = { "B
1afe0 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
1aff0 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
1b000 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
1b010 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
1b020 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1b030 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
1b040 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
1b050 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1b060 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
1b070 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1b080 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
1b090 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
1b0a0 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
1b0b0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1b0c0 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
1b0d0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1b0e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1b0f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
1b100 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
1b110 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
1b120 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
1b130 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1b140 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
1b150 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
1b160 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
1b170 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
1b180 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
1b190 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
1b1a0 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
1b1b0 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1b1c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1b1d0 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
1b1e0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1b1f0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1b200 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1b210 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
1b220 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
1b230 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1b240 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
1b250 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61  ee *pBt;.    sta
1b260 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
1b270 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
1b280 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1b290 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
1b2a0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
1b2b0 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
1b2c0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
1b2d0 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
1b2e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1b2f0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
1b300 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1b310 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
1b320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b330 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
1b340 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45   0, 0, SQLITE_DE
1b350 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
1b360 2c 20 66 6c 61 67 73 2c 20 26 70 42 74 29 3b 0a  , flags, &pBt);.
1b370 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1b390 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b3a0 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
1b3b0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
1b3c0 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
1b3d0 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
1b3e0 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
1b3f0 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  y tables");.    
1b400 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
1b410 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
1b420 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  1;.    }.    db-
1b430 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42  >aDb[1].pBt = pB
1b440 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  t;.    assert( d
1b450 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1b460 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  a );.    if( SQL
1b470 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74  ITE_NOMEM==sqlit
1b480 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
1b490 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74  ze(pBt, db->next
1b4a0 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29  Pagesize, -1, 0)
1b4b0 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   ){.      db->ma
1b4c0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
1b4d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1b4e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1b4f0 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c  3PagerSetJournal
1b500 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
1b510 65 50 61 67 65 72 28 70 42 74 29 2c 20 64 62 2d  ePager(pBt), db-
1b520 3e 64 66 6c 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  >dfltJournalMode
1b530 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1b540 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
1b550 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
1b560 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20  hat will verify 
1b570 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
1b580 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61  e and start.** a
1b590 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1b5a0 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20  n for all named 
1b5b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
1b5c0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f  **.** It is impo
1b5d0 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73  rtant that all s
1b5e0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65  chema cookies be
1b5f0 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c   verified and al
1b600 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61  l.** read transa
1b610 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65  ctions be starte
1b620 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e  d before anythin
1b630 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69  g else happens i
1b640 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72  n.** the VDBE pr
1b650 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73  ogram.  But this
1b660 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1b670 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63  called after muc
1b680 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20  h other.** code 
1b690 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74  has been generat
1b6a0 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20  ed.  So here is 
1b6b0 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a  what we do:.**.*
1b6c0 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
1b6d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1b6e0 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65   called, we code
1b6f0 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74   an OP_Goto that
1b700 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f  .** will jump to
1b710 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74   a subroutine at
1b720 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b730 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77  program.  Then w
1b740 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72  e.** record ever
1b750 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
1b760 6e 65 65 64 73 20 69 74 73 20 73 63 68 65 6d 61  needs its schema
1b770 20 76 65 72 69 66 69 65 64 20 69 6e 20 74 68 65   verified in the
1b780 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  .** pParse->cook
1b790 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c  ieMask field.  L
1b7a0 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20  ater, after all 
1b7b0 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20 62  other code has b
1b7c0 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64  een.** generated
1b7d0 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
1b7e0 20 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 63   that does the c
1b7f0 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
1b800 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74  ons and.** start
1b810 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
1b820 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64  ns will be coded
1b830 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f   and the OP_Goto
1b840 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c   P2 value.** wil
1b850 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69  l be made to poi
1b860 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f  nt to that subro
1b870 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65  utine.  The gene
1b880 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ration of the.**
1b890 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61   cookie verifica
1b8a0 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20  tion subroutine 
1b8b0 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20  code happens in 
1b8c0 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64  sqlite3FinishCod
1b8d0 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ing()..**.** If 
1b8e0 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  iDb<0 then code 
1b8f0 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79  the OP_Goto only
1b900 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61   - don't set fla
1b910 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a  g to verify the.
1b920 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79  ** schema on any
1b930 20 64 61 74 61 62 61 73 65 73 2e 20 20 54 68 69   databases.  Thi
1b940 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
1b950 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50   position the OP
1b960 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69  _Goto.** early i
1b970 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f  n the code, befo
1b980 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e  re we know if an
1b990 79 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  y database table
1b9a0 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a  s will be used..
1b9b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
1b9c0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
1b9d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1b9e0 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
1b9f0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1ba00 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1ba10 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 69  el(pParse);..  i
1ba20 66 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f  f( pToplevel->co
1ba30 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20  okieGoto==0 ){. 
1ba40 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
1ba50 69 74 65 33 47 65 74 56 64 62 65 28 70 54 6f 70  ite3GetVdbe(pTop
1ba60 6c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20  level);.    if( 
1ba70 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  v==0 ) return;  
1ba80 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
1ba90 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61  pens if there wa
1baa0 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  s a prior error 
1bab0 2a 2f 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  */.    pToplevel
1bac0 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73  ->cookieGoto = s
1bad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1bae0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1baf0 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0)+1;.  }.  if( 
1bb00 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  iDb>=0 ){.    sq
1bb10 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70  lite3 *db = pTop
1bb20 6c 65 76 65 6c 2d 3e 64 62 3b 0a 20 20 20 20 69  level->db;.    i
1bb30 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 61 73  nt mask;..    as
1bb40 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
1bb50 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
1bb60 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
1bb70 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
1bb80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
1bb90 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
1bba0 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d  ACHED+2 );.    m
1bbb0 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  ask = 1<<iDb;.  
1bbc0 20 20 69 66 28 20 28 70 54 6f 70 6c 65 76 65 6c    if( (pToplevel
1bbd0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
1bbe0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1bbf0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
1bc00 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
1bc10 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1bc20 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
1bc30 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
1bc40 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
1bc50 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69  _cookie;.      i
1bc60 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
1bc70 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
1bc80 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
1bc90 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f  TempDatabase(pTo
1bca0 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 7d  plevel);.      }
1bcb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1bcc0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
1bcd0 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
1bce0 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
1bcf0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
1bd00 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
1bd10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1bd20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bd30 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
1bd40 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
1bd50 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
1bd60 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
1bd70 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
1bd80 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
1bd90 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
1bda0 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
1bdb0 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
1bdc0 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
1bdd0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
1bde0 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
1bdf0 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
1be00 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
1be10 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
1be20 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
1be30 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
1be40 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
1be50 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
1be60 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
1be70 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
1be80 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
1be90 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
1bea0 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
1beb0 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
1bec0 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
1bed0 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
1bee0 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
1bef0 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
1bf00 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1bf10 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
1bf20 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
1bf30 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
1bf40 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
1bf50 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
1bf60 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
1bf70 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1bf80 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
1bf90 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
1bfa0 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
1bfb0 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
1bfc0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1bfd0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1bfe0 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
1bff0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1c000 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1c010 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74   pToplevel->writ
1c020 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b  eMask |= 1<<iDb;
1c030 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
1c040 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65  MultiWrite |= se
1c050 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f  tStatement;.}../
1c060 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
1c070 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
1c080 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1c090 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69   construction mi
1c0a0 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72  ght write.** mor
1c0b0 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79  e than one entry
1c0c0 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74   (example: delet
1c0d0 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e  ing one row then
1c0e0 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68   inserting anoth
1c0f0 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67  er,.** inserting
1c100 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69   multiple rows i
1c110 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e  n a table, or in
1c120 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e  serting a row an
1c130 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e  d index entries.
1c140 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74  ).** If an abort
1c150 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f   occurs after so
1c160 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74  me of these writ
1c170 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65  es have complete
1c180 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a  d, then it will.
1c190 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
1c1a0 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70  to undo the comp
1c1b0 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f  leted writes..*/
1c1c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c  .void sqlite3Mul
1c1d0 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70  tiWrite(Parse *p
1c1e0 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
1c1f0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1c200 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1c210 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
1c220 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
1c230 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  rite = 1;.}../* 
1c240 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
1c250 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69  erator calls thi
1c260 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20  s routine if is 
1c270 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69  discovers that i
1c280 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  t is.** possible
1c290 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74   to abort a stat
1c2a0 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63  ement prior to c
1c2b0 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f  ompletion.  In o
1c2c0 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66  rder to .** perf
1c2d0 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77  orm this abort w
1c2e0 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e  ithout corruptin
1c2f0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
1c300 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a  we need to make.
1c310 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ** sure that the
1c320 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72   statement is pr
1c330 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61  otected by a sta
1c340 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1c350 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69  on..**.** Techni
1c360 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e  cally, we only n
1c370 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d  eed to set the m
1c380 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20  ayAbort flag if 
1c390 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72  the.** isMultiWr
1c3a0 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65  ite flag was pre
1c3b0 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68  viously set.  Th
1c3c0 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65  ere is a time de
1c3d0 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68  pendency.** such
1c3e0 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20   that the abort 
1c3f0 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72  must occur after
1c400 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e   the multiwrite.
1c410 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20    This makes.** 
1c420 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20  some statements 
1c430 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45  involving the RE
1c440 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72  PLACE conflict r
1c450 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
1c460 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74  thm.** go a litt
1c470 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20  le faster.  But 
1c480 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65  taking advantage
1c490 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65   of this time de
1c4a0 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65  pendency.** make
1c4b0 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
1c4c0 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61  ult to prove tha
1c4d0 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f  t the code is co
1c4e0 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61  rrect (in .** pa
1c4f0 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65  rticular, it pre
1c500 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72  vents us from wr
1c510 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69  iting an effecti
1c520 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ve.** implementa
1c530 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41  tion of sqlite3A
1c540 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29  ssertMayAbort())
1c550 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
1c560 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b  chosen.** to tak
1c570 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65  e the safe route
1c580 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70   and skip the op
1c590 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  timization..*/.v
1c5a0 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62  oid sqlite3MayAb
1c5b0 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ort(Parse *pPars
1c5c0 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
1c5d0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1c5e0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1c5f0 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
1c600 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31  el->mayAbort = 1
1c610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
1c620 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20  an OP_Halt that 
1c630 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20  causes the vdbe 
1c640 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  to return an SQL
1c650 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a  ITE_CONSTRAINT.*
1c660 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45  * error. The onE
1c670 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64  rror parameter d
1c680 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
1c690 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20  (if any) of the 
1c6a0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64  statement.** and
1c6b0 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e  /or current tran
1c6c0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1c6d0 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  d back..*/.void 
1c6e0 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
1c6f0 72 61 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  raint(Parse *pPa
1c700 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
1c710 2c 20 63 68 61 72 20 2a 70 34 2c 20 69 6e 74 20  , char *p4, int 
1c720 70 34 74 79 70 65 29 7b 0a 20 20 56 64 62 65 20  p4type){.  Vdbe 
1c730 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1c740 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1c750 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
1c760 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  bort ){.    sqli
1c770 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
1c780 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  se);.  }.  sqlit
1c790 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1c7a0 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
1c7b0 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f 6e 45 72  CONSTRAINT, onEr
1c7c0 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79  ror, 0, p4, p4ty
1c7d0 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  pe);.}../*.** Ch
1c7e0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
1c7f0 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
1c800 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1c810 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
1c820 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
1c830 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
1c840 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
1c850 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c860 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1c870 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
1c880 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
1c890 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
1c8a0 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
1c8b0 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
1c8c0 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
1c8d0 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
1c8e0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1c8f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1c900 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1c910 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
1c920 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30  !=0 );.    if( 0
1c930 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1c940 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
1c950 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c960 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1c970 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
1c980 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
1c990 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1c9a0 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
1c9b0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1c9c0 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
1c9d0 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1c9e0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
1c9f0 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
1ca00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ca10 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
1ca20 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
1ca30 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1ca40 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
1ca50 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1ca60 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
1ca70 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1ca80 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1ca90 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1caa0 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
1cab0 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
1cac0 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
1cad0 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
1cae0 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
1caf0 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
1cb00 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
1cb10 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
1cb20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1cb30 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
1cb40 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
1cb50 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
1cb60 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1cb70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1cb80 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
1cb90 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1cba0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1cbb0 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
1cbc0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1cbd0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1cbe0 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
1cbf0 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
1cc00 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
1cc10 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
1cc20 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1cc30 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
1cc40 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
1cc50 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
1cc60 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
1cc70 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
1cc80 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1cc90 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
1cca0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1ccb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1ccc0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1ccd0 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
1cd00 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
1cd10 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1cd20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1cd30 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
1cd40 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
1cd50 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1cd60 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
1cd70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1cd80 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
1cd90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cda0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1cdb0 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
1cdc0 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
1cdd0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
1cde0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
1cdf0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
1ce00 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  /..  for(iDb=0, 
1ce10 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
1ce20 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
1ce30 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   pDb++){.    ass
1ce40 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20  ert( pDb!=0 );. 
1ce50 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
1ce60 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
1ce70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
1ce80 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
1ce90 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
1cea0 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
1ceb0 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1cec0 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
1ced0 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
1cee0 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, zColl);.   
1cef0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
1cf00 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1cf10 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
1cf20 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
1cf30 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
1cf40 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
1cf60 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
1cf70 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
1cf80 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
1cf90 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
1cfa0 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
1cfb0 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
1cfc0 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
1cfd0 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
1cfe0 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
1cff0 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
1d000 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
1d010 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
1d020 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
1d030 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
1d040 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
1d050 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
1d060 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
1d070 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
1d080 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
1d090 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
1d0a0 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
1d0b0 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
1d0c0 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
1d0d0 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
1d0e0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
1d0f0 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
1d100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1d110 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
1d120 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
1d130 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1d140 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
1d150 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
1d160 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
1d170 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
1d180 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
1d190 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
1d1a0 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
1d1b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d1c0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1d1d0 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
1d1e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1d1f0 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
1d200 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1d210 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
1d220 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1d230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1d240 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1d250 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
1d260 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1d270 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1d280 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1d290 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
1d2a0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
1d2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d2c0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
1d2d0 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
1d2e0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1d2f0 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
1d300 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1d310 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
1d320 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
1d330 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1d340 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1d350 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
1d360 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
1d370 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1d380 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
1d390 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
1d3a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
1d3b0 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
1d3c0 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
1d3d0 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
1d3e0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1d3f0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1d400 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
1d410 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
1d420 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pName1==0 ){.   
1d430 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
1d440 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
1d450 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
1d460 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d  e if( NEVER(pNam
1d470 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32  e2==0) || pName2
1d480 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ->z==0 ){.    ch
1d490 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61  ar *zColl;.    a
1d4a0 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a  ssert( pName1->z
1d4b0 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20   );.    zColl = 
1d4c0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1d4d0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1d4e0 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
1d4f0 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
1d500 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  n;.    pColl = s
1d510 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
1d520 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
1d530 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  Coll, 0);.    if
1d540 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
1d550 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
1d560 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  s(pParse, zColl)
1d570 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
1d580 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
1d590 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
1d5a0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d5b0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
1d5c0 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  l);.  }.  iDb = 
1d5d0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
1d5e0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
1d5f0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a  1, pName2, &pObj
1d600 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
1d610 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  <0 ) return;.  z
1d620 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1d630 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a  omToken(db, pObj
1d640 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
1d650 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44  0 ) return;.  zD
1d660 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
1d670 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  .zName;.  pTab =
1d680 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1d690 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
1d6a0 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
1d6b0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
1d6c0 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
1d6d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d6e0 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65  e(db, z);.    re
1d6f0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  turn;.  }.  pInd
1d700 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
1d710 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62  Index(db, z, zDb
1d720 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1d730 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28  ee(db, z);.  if(
1d740 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
1d750 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1d760 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1d770 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
1d780 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1d790 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1d7a0 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
1d7b0 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
1d7c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1d7d0 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e   "unable to iden
1d7e0 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20  tify the object 
1d7f0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22  to be reindexed"
1d800 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1d810 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61  ** Return a dyna
1d820 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  micly allocated 
1d830 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
1d840 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  e that can be us
1d850 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70  ed.** with OP_Op
1d860 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65  enRead or OP_Ope
1d870 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65 73 73  nWrite to access
1d880 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
1d890 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  pIdx..**.** If s
1d8a0 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69  uccessful, a poi
1d8b0 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
1d8c0 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74  structure is ret
1d8d0 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
1d8e0 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  ase.** the calle
1d8f0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1d900 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c   for calling sql
1d910 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 29  ite3DbFree(db, )
1d920 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
1d930 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66   .** pointer. If
1d940 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1d950 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20   (out of memory 
1d960 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61  or missing colla
1d970 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63  tion .** sequenc
1d980 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  e), NULL is retu
1d990 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74 61  rned and the sta
1d9a0 74 65 20 6f 66 20 70 50 61 72 73 65 20 75 70 64  te of pParse upd
1d9b0 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74 0a  ated to reflect.
1d9c0 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f  ** the error..*/
1d9d0 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
1d9e0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50 61  3IndexKeyinfo(Pa
1d9f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
1da00 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74  ex *pIdx){.  int
1da10 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   i;.  int nCol =
1da20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
1da30 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20 73    int nBytes = s
1da40 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
1da50 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
1da60 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f  (CollSeq*) + nCo
1da70 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
1da80 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1da90 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
1daa0 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69   (KeyInfo *)sqli
1dab0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1dac0 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20  db, nBytes);..  
1dad0 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
1dae0 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50 61 72 73  pKey->db = pPars
1daf0 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d  e->db;.    pKey-
1db00 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
1db10 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c  8 *)&(pKey->aCol
1db20 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73  l[nCol]);.    as
1db30 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f  sert( &pKey->aSo
1db40 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26  rtOrder[nCol]==&
1db50 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42  (((u8 *)pKey)[nB
1db60 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f  ytes]) );.    fo
1db70 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
1db80 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
1db90 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
1dba0 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
1dbb0 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b  assert( zColl );
1dbc0 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f  .      pKey->aCo
1dbd0 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c  ll[i] = sqlite3L
1dbe0 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
1dbf0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
1dc00 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
1dc10 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
1dc20 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
1dc30 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46    }.    pKey->nF
1dc40 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c  ield = (u16)nCol
1dc50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1dc60 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
1dc70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1dc80 62 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b  b, pKey);.    pK
1dc90 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
1dca0 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a           turn pKey;.}.