/ Hex Artifact Content
Login

Artifact 7c3d65786203426e99bae6a95ef0fe67e5f8b18b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0f40: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0f50: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0f60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f90: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
0fc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
0fd0: 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e  gin by generatin
0fe0: 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69  g some terminati
0ff0: 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65  on code at the e
1000: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76  nd of the.  ** v
1010: 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f  dbe program.  */
1020: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1030: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1040: 20 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65   assert( !pParse
1050: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a  ->isMultiWrite .
1060: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1070: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
1080: 6f 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d  ort(v, pParse->m
1090: 61 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28  ayAbort));.  if(
10a0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
10b0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10c0: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
10d0: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
10e0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
10f0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1100: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1110: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1120: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1130: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1140: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1150: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
1160: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1170: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
1180: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1190: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
11a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
11b0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
11c0: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
11d0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
11e0: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
11f0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1200: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1210: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1220: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79  oto>0 ){.      y
1230: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20  DbMask mask;.   
1240: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
1250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1260: 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d  pHere(v, pParse-
1270: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a  >cookieGoto-1);.
1280: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c        for(iDb=0,
1290: 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d   mask=1; iDb<db-
12a0: 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20  >nDb; mask<<=1, 
12b0: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iDb++){.        
12c0: 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72  if( (mask & pPar
12d0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d  se->cookieMask)=
12e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1310: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
1320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1330: 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c  ,OP_Transaction,
1340: 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50   iDb, (mask & pP
1350: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29  arse->writeMask)
1360: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
1370: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1390: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13a0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13b0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
13c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13e0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20  VerifyCookie,.  
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 69 44 62 2c 20 70            iDb, p
1410: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
1420: 75 65 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20  ue[iDb],.       
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1450: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65  ].pSchema->iGene
1460: 72 61 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ration);.       
1470: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64   }.      }.#ifnd
1480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1490: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
14a0: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
14b0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
14c0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56  =0; i<pParse->nV
14d0: 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  tabLock; i++){. 
14e0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76           char *v
14f0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1500: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1510: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1520: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1540: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65  AddOp4(v, OP_VBe
1550: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74  gin, 0, 0, 0, vt
1560: 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
1570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1580: 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63  pParse->nVtabLoc
1590: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  k = 0;.      }.#
15a0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
15b0: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
15c0: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
15d0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
15e0: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
15f0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
1600: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
1610: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
1620: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1630: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1640: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1650: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1660: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1670: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1680: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1690: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
16a0: 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  y AUTOINCREMENT 
16b0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
16c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
16d0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
16e0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67  AutoincrementBeg
16f0: 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  in(pParse);..   
1700: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1710: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1720: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1730: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1740: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1750: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1760: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
1770: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b  se->cookieGoto);
1780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1790: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
17a0: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
17b0: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
17c0: 20 20 69 66 28 20 76 20 26 26 20 41 4c 57 41 59    if( v && ALWAY
17d0: 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  S(pParse->nErr==
17e0: 30 29 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  0) && !db->mallo
17f0: 63 46 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65  cFailed ){.#ifde
1800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1810: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
1820: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
1830: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21  LITE_VdbeTrace)!
1840: 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b  =0 ? stdout : 0;
1850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1860: 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b  Trace(v, trace);
1870: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
1880: 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
1890: 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f  heLevel==0 );  /
18a0: 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72  * Disables and r
18b0: 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20  e-enables match 
18c0: 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69  */.    /* A mini
18d0: 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f  mum of one curso
18e0: 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69 66  r is required if
18f0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69   autoincrement i
1900: 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65  s used.    *  Se
1910: 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37  e ticket [a69637
1920: 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20  9c1f08866] */.  
1930: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41    if( pParse->pA
1940: 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73 65  inc!=0 && pParse
1950: 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72  ->nTab==0 ) pPar
1960: 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20  se->nTab = 1;.  
1970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
1980: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
1990: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
19a0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
19b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
19c0: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
19d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
19e0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
19f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
1a00: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
1a10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
1a20: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
1a30: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1a40: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72  nVar = 0;.  pPar
1a50: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d  se->cookieMask =
1a60: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1a70: 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a  okieGoto = 0;.}.
1a80: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1a90: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1aa0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1ab0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1ac0: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1ad0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1ae0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1af0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b00: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1b10: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1b20: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1b30: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1b40: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1b50: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1b60: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1b70: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1b80: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1b90: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1ba0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1bb0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1bc0: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1bd0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1be0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1bf0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1c00: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1c10: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1c20: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1c30: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1c40: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1c50: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1c60: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1c70: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1c80: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1c90: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1ca0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1cb0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1cc0: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1cd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ce0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1cf0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1d00: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1d10: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1d20: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
1d30: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
1d40: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
1d50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d60: 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45  b;.# define SAVE
1d70: 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72  _SZ  (sizeof(Par
1d80: 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50  se) - offsetof(P
1d90: 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68  arse,nVar)).  ch
1da0: 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f  ar saveBuf[SAVE_
1db0: 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  SZ];..  if( pPar
1dc0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
1dd0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
1de0: 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29  rse->nested<10 )
1df0: 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68  ;  /* Nesting sh
1e00: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20  ould only be of 
1e10: 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f  limited depth */
1e20: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1e30: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
1e40: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
1e50: 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  tf(db, zFormat, 
1e60: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1e70: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
1e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20   ){.    return; 
1e90: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75    /* A malloc mu
1ea0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1eb0: 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  /.  }.  pParse->
1ec0: 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63  nested++;.  memc
1ed0: 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61  py(saveBuf, &pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f  rse->nVar, SAVE_
1ef0: 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  SZ);.  memset(&p
1f00: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20  Parse->nVar, 0, 
1f10: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  SAVE_SZ);.  sqli
1f20: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
1f30: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
1f40: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1f50: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1f60: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f70: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
1f80: 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d   memcpy(&pParse-
1f90: 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20  >nVar, saveBuf, 
1fa0: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72  SAVE_SZ);.  pPar
1fb0: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
1fc0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1fd0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1fe0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1ff0: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
2000: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
2010: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
2020: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
2030: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
2040: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
2050: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
2060: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
2070: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
2080: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2090: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
20a0: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
20b0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
20c0: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
20d0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73   and the.** firs
20e0: 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  t matching table
20f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
2100: 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  No checking for 
2110: 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a  duplicate table.
2120: 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ** names is done
2130: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
2140: 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72  rder is TEMP fir
2150: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2160: 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c  hen any.** auxil
2170: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
2180: 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  dded using the A
2190: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
21a0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
21b0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
21c0: 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ()..*/.Table *sq
21d0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73  lite3FindTable(s
21e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
21f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
2200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
2210: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
2220: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
2230: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61    int nName;.  a
2240: 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
2250: 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  );.  nName = sql
2260: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
2270: 6d 65 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  me);.  /* All mu
2280: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
2290: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
22a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
22b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
22c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61 74  /.  assert( zDat
22d0: 61 62 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69  abase!=0 || sqli
22e0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
22f0: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
2300: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
2310: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
2320: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2330: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2340: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
2350: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2360: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
2370: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
2380: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2390: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
23a0: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
23b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
23c0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
23d0: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
23e0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
23f0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
2400: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
2410: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e  blHash, zName, n
2420: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
2430: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2440: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
2450: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2460: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2470: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2480: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2490: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
24a0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
24b0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
24c0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
24d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
24e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
24f0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
2500: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
2510: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
2520: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
2530: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2540: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
2550: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2560: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2570: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
2580: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2590: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
25a0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
25b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
25c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
25d0: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
25e0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
25f0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
2600: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
2610: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
2620: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2630: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
2640: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
2650: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rors */.  int is
2660: 56 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  View,           
2670: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b   /* True if look
2680: 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72  ing for a VIEW r
2690: 61 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42  ather than a TAB
26a0: 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LE */.  const ch
26b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f  ar *zName,     /
26c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
26d0: 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ble we are looki
26e0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  ng for */.  cons
26f0: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20  t char *zDbase  
2700: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2710: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67  e database.  Mig
2720: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
2730: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
2740: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2750: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2760: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2770: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2780: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2790: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
27a0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
27b0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
27c0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
27d0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
27e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
27f0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
2800: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
2810: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
2820: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
2830: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2840: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56  char *zMsg = isV
2850: 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76  iew ? "no such v
2860: 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20  iew" : "no such 
2870: 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20  table";.    if( 
2880: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
2890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28a0: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
28b0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73  %s", zMsg, zDbas
28c0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
28d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
28e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28f0: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
2900: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
2910: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
2920: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
2930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2940: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2950: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
2960: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
2970: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
2980: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
2990: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
29b0: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
29c0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
29d0: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
29e0: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
29f0: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
2a00: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
2a10: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
2a20: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
2a30: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
2a40: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
2a50: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
2a60: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
2a70: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
2a80: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
2a90: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
2aa0: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
2ab0: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
2ac0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2ad0: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
2ae0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20  *pParse, .  int 
2af0: 69 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63  isView, .  struc
2b00: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b10: 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  p.){.  const cha
2b20: 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74  r *zDb;.  assert
2b30: 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20  ( p->pSchema==0 
2b40: 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d  || p->zDatabase=
2b50: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
2b60: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e  Schema ){.    in
2b70: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
2b80: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
2b90: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68  rse->db, p->pSch
2ba0: 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20  ema);.    zDb = 
2bb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
2bc0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65  iDb].zName;.  }e
2bd0: 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70  lse{.    zDb = p
2be0: 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d  ->zDatabase;.  }
2bf0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2c00: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
2c10: 72 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e  rse, isView, p->
2c20: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
2c30: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2c40: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2c50: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2c60: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2c70: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2c80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2c90: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2ca0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
2cb0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
2cc0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
2cd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
2ce0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2cf0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
2d00: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2d10: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2d20: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2d30: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2d40: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2d50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2d60: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2d70: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2d80: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2d90: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2da0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2db0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2dc0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2dd0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2de0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2df0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2e00: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2e10: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2e20: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2e30: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2e40: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2e50: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2e60: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2e70: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2e80: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2e90: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2ea0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2eb0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2ec0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2ed0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2ee0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2ef0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2f00: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2f10: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2f20: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2f30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2f40: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2f50: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2f60: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2f70: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2f80: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2f90: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2fa0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2fb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2fc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2fd0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2fe0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ff0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
3000: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3010: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
3020: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
3030: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
3040: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
3050: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
3060: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3090: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
30a0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
30b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
30c0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
30d0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
30e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30f0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
3100: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
3110: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3120: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3130: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3140: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3150: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3160: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
3170: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  );.  if( p->isRe
3180: 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44  sized ) sqlite3D
3190: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 43  bFree(db, p->azC
31a0: 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  oll);.  sqlite3D
31b0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
31c0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
31d0: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
31e0: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
31f0: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
3200: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
3210: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
3220: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
3230: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
3240: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
3250: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
3260: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
3270: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
3280: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
3290: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
32a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
32b0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
32c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
32d0: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
32e0: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
32f0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
3300: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68   int len;.  Hash
3310: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
3320: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3330: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3340: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
3350: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
3360: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
3370: 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69  sh;.  len = sqli
3380: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 78  te3Strlen30(zIdx
3390: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20  Name);.  pIndex 
33a0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
33b0: 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e  ert(pHash, zIdxN
33c0: 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20 20  ame, len, 0);.  
33d0: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65  if( ALWAYS(pInde
33e0: 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  x) ){.    if( pI
33f0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3400: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
3410: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
3420: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
3430: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
3450: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f  ndex *p;.      /
3460: 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
3470: 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68  of ALWAYS();  Th
3480: 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
3490: 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20  on the list of. 
34a0: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e       ** indices.
34b0: 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49   */.      p = pI
34c0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
34d0: 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
34e0: 65 28 20 41 4c 57 41 59 53 28 70 29 20 26 26 20  e( ALWAYS(p) && 
34f0: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
3500: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
3510: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ; }.      if( AL
3520: 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65  WAYS(p && p->pNe
3530: 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20  xt==pIndex) ){. 
3540: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
3550: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3570: 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c     freeIndex(db,
3580: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20   pIndex);.  }.  
3590: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
35a0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
35b0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b  s;.}../*.** Look
35c0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73   through the lis
35d0: 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 61  t of open databa
35e0: 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e  se files in db->
35f0: 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20  aDb[] and if.** 
3600: 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63 6c  any have been cl
3610: 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65  osed, remove the
3620: 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e  m from the list.
3630: 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Reallocate the
3640: 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74  .** db->aDb[] st
3650: 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d 61  ructure to a sma
3660: 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70 6f  ller size, if po
3670: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e  ssible..**.** En
3680: 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69 6e  try 0 (the "main
3690: 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64 20  " database) and 
36a0: 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74 65  entry 1 (the "te
36b0: 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a 2a  mp" database).**
36c0: 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64 69   are never candi
36d0: 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67 20  dates for being 
36e0: 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f  collapsed..*/.vo
36f0: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  id sqlite3Collap
3700: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
3710: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
3720: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
3730: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
3740: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
3750: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
3760: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
3770: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
3780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3790: 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e  Free(db, pDb->zN
37a0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
37b0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
37c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
37d0: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
37e0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
37f0: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
3800: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
3810: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
3820: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
3830: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
3840: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
3850: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
3860: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
3870: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
3880: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
3890: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
38a0: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
38b0: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
38c0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ));.    sqlite3D
38d0: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
38e0: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
38f0: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
3900: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
3910: 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66  set the schema f
3920: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
3930: 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41  at index iDb.  A
3940: 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a  lso reset the.**
3950: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f   TEMP schema..*/
3960: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
3970: 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69  etOneSchema(sqli
3980: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3990: 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  ){.  Db *pDb;.  
39a0: 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
39b0: 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73  nDb );..  /* Cas
39c0: 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65 20  e 1:  Reset the 
39d0: 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69 64  single schema id
39e0: 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62 20  entified by iDb 
39f0: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
3a00: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65  aDb[iDb];.  asse
3a10: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3a20: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3a30: 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65  Db, 0) );.  asse
3a40: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
3a50: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
3a60: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
3a70: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a  >pSchema);..  /*
3a80: 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73 65   If any database
3a90: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d 50   other than TEMP
3aa0: 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e 20   is reset, then 
3ab0: 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50 0a  also reset TEMP.
3ac0: 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50 20    ** since TEMP 
3ad0: 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e 67  might be holding
3ae0: 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20 72   triggers that r
3af0: 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73 20  eference tables 
3b00: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  in the.  ** othe
3b10: 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  r database..  */
3b20: 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b  .  if( iDb!=1 ){
3b30: 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  .    pDb = &db->
3b40: 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65  aDb[1];.    asse
3b50: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
3b60: 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
3b70: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
3b80: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
3b90: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
3ba0: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
3bb0: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
3bc0: 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68   from all attach
3bd0: 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e  ed databases (in
3be0: 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e  cluding.** "main
3bf0: 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f  " and "temp") fo
3c00: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
3c10: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
3c20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
3c30: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
3c40: 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74  Connection(sqlit
3c50: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
3c60: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
3c70: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
3c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
3c90: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
3ca0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3cb0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3cc0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
3cd0: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
3ce0: 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65  Clear(pDb->pSche
3cf0: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ma);.    }.  }. 
3d00: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
3d10: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3d20: 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74  ges;.  sqlite3Vt
3d30: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
3d40: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
3d50: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20  LeaveAll(db);.  
3d60: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
3d70: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
3d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3d90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3da0: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
3db0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
3dc0: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
3dd0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
3de0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
3df0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
3e00: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
3e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
3e20: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
3e30: 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  d for the column
3e40: 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c   names of a tabl
3e50: 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a  e or view (the.*
3e60: 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61  * Table.aCol[] a
3e70: 72 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rray)..*/.static
3e80: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
3e90: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71  teColumnNames(sq
3ea0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
3eb0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
3ec0: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
3ed0: 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ol;.  assert( pT
3ee0: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
3ef0: 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d   (pCol = pTable-
3f00: 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20  >aCol)!=0 ){.   
3f10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
3f20: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
3f30: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  Col++){.      sq
3f40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3f50: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
3f60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3f70: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
3f80: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  pDflt);.      sq
3f90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3fa0: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20  pCol->zDflt);.  
3fb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3fc0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70  e(db, pCol->zTyp
3fd0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
3fe0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
3ff0: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
4000: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4010: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43  e(db, pTable->aC
4020: 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ol);.  }.}../*.*
4030: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
4040: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
4050: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
4060: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
4070: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
4080: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
4090: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
40a0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
40b0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
40c0: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
40d0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
40e0: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
40f0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
4100: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
4110: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
4120: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
4130: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
4140: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
4150: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4160: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
4170: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
4180: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
4190: 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69  e db parameter i
41a0: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20  s optional.  It 
41b0: 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  is needed if the
41c0: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a   Table object .*
41d0: 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61  * contains looka
41e0: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54  side memory.  (T
41f0: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20  able objects in 
4200: 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f  the schema do no
4210: 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69  t use.** lookasi
4220: 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73  de memory, but s
4230: 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61  ome ephemeral Ta
4240: 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29  ble objects do.)
4250: 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70    Or the.** db p
4260: 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20  arameter can be 
4270: 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e  used with db->pn
4280: 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65  BytesFreed to me
4290: 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  asure the memory
42a0: 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20  .** used by the 
42b0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Table object..*/
42c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
42d0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
42e0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
42f0: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
4300: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
4310: 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e   TESTONLY( int n
4320: 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20  Lookaside; ) /* 
4330: 55 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c  Used to verify l
4340: 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65  ookaside not use
4350: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a  d for schema */.
4360: 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61 62  .  assert( !pTab
4370: 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e 52  le || pTable->nR
4380: 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f  ef>0 );..  /* Do
4390: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
43a0: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
43b0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
43c0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
43d0: 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29  .  if( !pTable )
43e0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
43f0: 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  (!db || db->pnBy
4400: 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20  tesFreed==0) && 
4410: 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29  (--pTable->nRef)
4420: 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  >0) ) return;.. 
4430: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
4440: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
4450: 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61  ding lookaside a
4460: 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73 63  llocations in sc
4470: 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a  hema Tables.  **
4480: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
4490: 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72 61  any free() opera
44a0: 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73 63  tions.  Since sc
44b0: 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20 6e  hema Tables do n
44c0: 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b  ot use.  ** look
44d0: 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d 62  aside, this numb
44e0: 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68  er should not ch
44f0: 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f  ange. */.  TESTO
4500: 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20  NLY( nLookaside 
4510: 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c 65  = (db && (pTable
4520: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
4530: 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f  Ephemeral)==0) ?
4540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4550: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f            db->lo
4560: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30  okaside.nOut : 0
4570: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
4580: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4590: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
45a0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
45b0: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
45c0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
45d0: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
45e0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
45f0: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4600: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4610: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
4620: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
4630: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
4640: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
4650: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
4660: 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a  Name = pIndex->z
4670: 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53  Name; .      TES
4680: 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70  TONLY ( Index *p
4690: 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48  Old = ) sqlite3H
46a0: 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20  ashInsert(.     
46b0: 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63      &pIndex->pSc
46c0: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
46d0: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
46e0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30 0a  len30(zName), 0.
46f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4700: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4710: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4720: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4730: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4740: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4750: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4760: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4770: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4780: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4790: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
47a0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
47b0: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
47c0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
47d0: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
47e0: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
47f0: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4800: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4810: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65  .  */.  sqliteDe
4820: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4830: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73  db, pTable);.  s
4840: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4850: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
4860: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4870: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
4880: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
4890: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
48a0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
48b0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
48c0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73  E_OMIT_CHECK.  s
48d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
48e0: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  lete(db, pTable-
48f0: 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66  >pCheck);.#endif
4900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4910: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4920: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
4930: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
4940: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
4950: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4960: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
4970: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
4980: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
4990: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
49a0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
49b0: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
49c0: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
49d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
49e0: 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ut );.}../*.** U
49f0: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
4a00: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
4a10: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
4a20: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
4a30: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
4a40: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
4a50: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
4a60: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
4a70: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
4a80: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
4a90: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
4aa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
4ab0: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
4ac0: 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a   *p;.  Db *pDb;.
4ad0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
4ae0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
4af0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
4b00: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
4b10: 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61   zTabName );.  a
4b20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
4b30: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4b40: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74  , iDb, 0) );.  t
4b50: 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d  estcase( zTabNam
4b60: 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a  e[0]==0 );  /* Z
4b70: 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65  ero-length table
4b80: 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77   names are allow
4b90: 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  ed */.  pDb = &d
4ba0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
4bb0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
4bc0: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4bd0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  ma->tblHash, zTa
4be0: 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  bName,.         
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4c00: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4c10: 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73  TabName),0);.  s
4c20: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
4c30: 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e  e(db, p);.  db->
4c40: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
4c50: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
4c60: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
4c70: 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20  token, return a 
4c80: 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73  string that cons
4c90: 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74  ists of the text
4ca0: 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65   of that.** toke
4cb0: 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
4cc0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
4cd0: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61  tring.** is obta
4ce0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4cf0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
4d00: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
4d10: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
4d20: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ction..**.** Any
4d30: 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73   quotation marks
4d40: 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27   (ex:  "name", '
4d50: 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f  name', [name], o
4d60: 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a  r `name`) that.*
4d70: 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62  * surround the b
4d80: 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  ody of the token
4d90: 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a   are removed..**
4da0: 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f  .** Tokens are o
4db0: 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65  ften just pointe
4dc0: 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  rs into the orig
4dd0: 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e  inal SQL text an
4de0: 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  d so.** are not 
4df0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
4e00: 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73  and are not pers
4e10: 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74  istent.  The ret
4e20: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
4e30: 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  is \000 terminat
4e40: 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73  ed and is persis
4e50: 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tent..*/.char *s
4e60: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4e70: 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ken(sqlite3 *db,
4e80: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
4e90: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
4ea0: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
4eb0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
4ec0: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
4ed0: 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20  char*)pName->z, 
4ee0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  pName->n);.    s
4ef0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
4f00: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
4f10: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
4f20: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
4f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
4f40: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
4f50: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
4f60: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
4f70: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
4f80: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
4f90: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
4fa0: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
4fb0: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
4fc0: 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a  terTable(Parse *
4fd0: 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  p, int iDb){.  V
4fe0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
4ff0: 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71  GetVdbe(p);.  sq
5000: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
5010: 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f  , iDb, MASTER_RO
5020: 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41  OT, 1, SCHEMA_TA
5030: 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c  BLE(iDb));.  sql
5040: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5050: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
5060: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
5070: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
5080: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
5090: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
50a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
50b0: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
50c0: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
50d0: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
50e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
50f0: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5100: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5110: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5120: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5130: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5140: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5150: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
5160: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5170: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
5180: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
5190: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
51a0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
51b0: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
51c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
51d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
51e0: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
51f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5200: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5210: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5220: 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20  b *pDb;.    int 
5230: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
5240: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
5250: 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31  for(i=(db->nDb-1
5260: 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b  ), pDb=&db->aDb[
5270: 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  i]; i>=0; i--, p
5280: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Db--){.      if(
5290: 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c   (!OMIT_TEMPDB |
52a0: 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73  | i!=1 ) && n==s
52b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
52c0: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20  Db->zName) && . 
52d0: 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
52e0: 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e  te3StrICmp(pDb->
52f0: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  zName, zName) ){
5300: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5320: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
5330: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
5340: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
5350: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
5360: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
5370: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
5380: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
5390: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
53a0: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
53b0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
53c0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
53d0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
53e0: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
53f0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5400: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
5410: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
5420: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
5430: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
5440: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  me){.  int i;   
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5470: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
5480: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
54b0: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
54c0: 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65  g for */.  zName
54d0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
54e0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
54f0: 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65  e);.  i = sqlite
5500: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
5510: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
5520: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
5530: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  e);.  return i;.
5540: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
5550: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
5560: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
5570: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
5580: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
5590: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
55a0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
55b0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
55c0: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
55d0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
55e0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
55f0: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
5600: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5610: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
5620: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
5630: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
5640: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
5650: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
5660: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
5670: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
5680: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
5690: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
56a0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
56b0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
56c0: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
56d0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
56e0: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
56f0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5700: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5710: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
5720: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
5730: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
5740: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
5750: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5760: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
5770: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
5780: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
5790: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
57a0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
57b0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
57c0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
57d0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
57e0: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
57f0: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
5800: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
5810: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
5820: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
5830: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
5840: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
5850: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
5860: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
5870: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
5880: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
5890: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
58a0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
58b0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
58c0: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
58d0: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
58e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
58f0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41  >db;..  if( ALWA
5900: 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26  YS(pName2!=0) &&
5910: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
5920: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
5930: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
5940: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5950: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
5960: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
5970: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5980: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
5990: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  -1;.    }.    *p
59a0: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
59b0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
59c0: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
59d0: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
59e0: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
59f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5a00: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
5a10: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
5a20: 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  e1);.      pPars
5a30: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5a40: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5a50: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
5a60: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
5a70: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
5a80: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
5a90: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
5aa0: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
5ab0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
5ac0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
5ad0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5ae0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
5af0: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
5b00: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
5b10: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
5b20: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
5b30: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
5b40: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
5b50: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
5b60: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
5b70: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
5b80: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
5b90: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
5ba0: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
5bb0: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
5bc0: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
5bd0: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
5be0: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
5bf0: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
5c00: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
5c10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
5c20: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
5c30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
5c40: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
5c50: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
5c60: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
5c70: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
5c80: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
5c90: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
5ca0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
5cb0: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
5cc0: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
5cd0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
5ce0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
5cf0: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
5d00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5d10: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
5d20: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
5d30: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
5d40: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
5d50: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
5d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5d70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5d80: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
5d90: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
5da0: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
5db0: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
5dc0: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
5dd0: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
5de0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
5df0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
5e00: 2d 3e 61 75 74 6f 49 6e 64 65 78 21 3d 32 3b 20  ->autoIndex!=2; 
5e10: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
5e20: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
5e30: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
5e40: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
5e50: 64 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  dx that correspo
5e60: 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20  nds to table.** 
5e70: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65  column iCol.  Re
5e80: 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66  turn -1 if not f
5e90: 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c  ound..*/.i16 sql
5ea0: 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
5eb0: 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  x(Index *pIdx, i
5ec0: 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  16 iCol){.  int 
5ed0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5ee0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
5ef0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f  ++){.    if( iCo
5f00: 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  l==pIdx->aiColum
5f10: 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b  n[i] ) return i;
5f20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
5f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
5f40: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
5f50: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
5f60: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
5f70: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
5f80: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
5f90: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
5fa0: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
5fb0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
5fc0: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
5fd0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5fe0: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
5ff0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6000: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
6010: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
6020: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
6030: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
6040: 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65  e name. The isTe
6050: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
6060: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
6070: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
6080: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
6090: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
60a0: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
60b0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
60c0: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
60d0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
60e0: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
60f0: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
6100: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
6110: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
6120: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
6130: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
6140: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
6150: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
6160: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
6170: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
6180: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
6190: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
61a0: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
61b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
61c0: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
61d0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
61e0: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
61f0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
6200: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
6210: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
6220: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6230: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
6240: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
6250: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
6260: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
6270: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
6280: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6290: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
62a0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
62b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
62c0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
62d0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
62e0: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
62f0: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
6300: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6310: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
6320: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
6330: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
6340: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6350: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
6360: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
6370: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6380: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
6390: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
63a0: 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72  View,      /* Tr
63b0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
63c0: 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73  VIEW */.  int is
63d0: 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72  Virtual,   /* Tr
63e0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
63f0: 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f  VIRTUAL table */
6400: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
6410: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
6420: 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61  g if table alrea
6430: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
6440: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
6450: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
6460: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
6470: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
6480: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6490: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
64a0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
64b0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
64c0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
64d0: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
64e0: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
64f0: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
6500: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
6510: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
6520: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
6530: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
6540: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
6550: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
6560: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
6570: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
6580: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
6590: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
65a0: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
65b0: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
65c0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
65d0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
65e0: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
65f0: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
6600: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
6610: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
6620: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
6630: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
6640: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
6650: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
6660: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
6670: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
6680: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
6690: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
66a0: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
66b0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
66c0: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
66d0: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
66e0: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
66f0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
6700: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
6710: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
6720: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
6730: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
6740: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
6750: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
6760: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
6770: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
6780: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
6790: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
67a0: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
67b0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
67c0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
67d0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
67e0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
67f0: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
6800: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6810: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6820: 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d 65   isTemp && pName
6830: 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d 31  2->n>0 && iDb!=1
6840: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
6850: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
6860: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
6870: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
6880: 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20 20  ed. Unless .    
6890: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
68a0: 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61  name is "temp" a
68b0: 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 73  nyway.  */.    s
68c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
68d0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
68e0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
68f0: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
6900: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
6910: 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f    }.  if( !OMIT_
6920: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6930: 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70   ) iDb = 1;..  p
6940: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
6950: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e  n = *pName;.  zN
6960: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
6970: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
6980: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
6990: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
69a0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
69b0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
69c0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
69d0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
69e0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
69f0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
6a00: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
6a10: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
6a20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6a30: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
6a40: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
6a50: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
6a60: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  ;.  {.    int co
6a70: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  de;.    char *zD
6a80: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
6a90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
6aa0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
6ab0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
6ac0: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
6ad0: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
6ae0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
6af0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6b00: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
6b10: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
6b20: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
6b30: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
6b40: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
6b50: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6b60: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
6b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6b80: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6b90: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
6ba0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6bb0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
6bc0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
6bd0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6be0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6bf0: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
6c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6c10: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6c20: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
6c30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
6c40: 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20  ( !isVirtual && 
6c50: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
6c60: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a  (pParse, code, z
6c70: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
6c80: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6c90: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6ca0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
6cb0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
6cc0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
6cd0: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
6ce0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
6cf0: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
6d00: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
6d10: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
6d20: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
6d30: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
6d40: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65   ** it does. The
6d50: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
6d60: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62   the statement b
6d70: 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20  eing parsed was 
6d80: 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61  passed.  ** to a
6d90: 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  n sqlite3_declar
6da0: 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49  e_vtab() call. I
6db0: 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79  n that case only
6dc0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
6dd0: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73  s.  ** and types
6de0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73   will be used, s
6df0: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  o there is no ne
6e00: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e  ed to test for n
6e10: 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f  amespace.  ** co
6e20: 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  llisions..  */. 
6e30: 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45   if( !IN_DECLARE
6e40: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 63 68 61  _VTAB ){.    cha
6e50: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
6e60: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
6e70: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
6e80: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
6e90: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
6ea0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6eb0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
6ec0: 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71  .    pTable = sq
6ed0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
6ee0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  b, zName, zDb);.
6ef0: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
6f00: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45  {.      if( !noE
6f10: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
6f20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6f30: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
6f40: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
6f50: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   pName);.      }
6f60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
6f70: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
6f80: 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20  busy );.        
6f90: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
6fa0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
6fb0: 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
6fc0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6fd0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
6fe0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
6ff0: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
7000: 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b  Name, zDb)!=0 ){
7010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
7020: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7030: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
7040: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
7050: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
7060: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7070: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7080: 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d  .  }..  pTable =
7090: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
70a0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
70b0: 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
70c0: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
70d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
70e0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65   = 1;.    pParse
70f0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
7100: 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  MEM;.    pParse-
7110: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
7120: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7130: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
7140: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
7150: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
7160: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
7170: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
7180: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
7190: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  ;.  pTable->nRef
71a0: 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 1;.  pTable->
71b0: 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37  nRowEst = 104857
71c0: 36 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  6;.  assert( pPa
71d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
71e0: 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  0 );.  pParse->p
71f0: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
7200: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
7210: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
7220: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
7230: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
7240: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
7250: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
7260: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
7270: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
7280: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
7290: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
72a0: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
72b0: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
72c0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
72d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
72e0: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NCREMENT.  if( !
72f0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
7300: 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  & strcmp(zName, 
7310: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
7320: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ")==0 ){.    ass
7330: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
7340: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
7350: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
7360: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
7370: 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65  pSeqTab = pTable
7380: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
7390: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
73a0: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
73b0: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
73c0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
73d0: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
73e0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
73f0: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
7400: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
7410: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
7420: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
7430: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
7440: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
7450: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
7460: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
7470: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
7480: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
7490: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
74a0: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
74b0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
74c0: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
74d0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
74e0: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
74f0: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
7500: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
7510: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
7520: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
7530: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
7540: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
7550: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
7560: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
7570: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
7580: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
7590: 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65  j1;.    int file
75a0: 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20  Format;.    int 
75b0: 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33  reg1, reg2, reg3
75c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
75d0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
75e0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
75f0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
7600: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7610: 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69  BLE.    if( isVi
7620: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
7630: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7640: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
7650: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
7660: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
7670: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
7680: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
7690: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
76a0: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
76b0: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
76c0: 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20    */.    reg1 = 
76d0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
76e0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
76f0: 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50  m;.    reg2 = pP
7700: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20  arse->regRoot = 
7710: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7720: 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61      reg3 = ++pPa
7730: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
7740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7750: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
7760: 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54  e, iDb, reg3, BT
7770: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29  REE_FILE_FORMAT)
7780: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7790: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
77a0: 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  b);.    j1 = sql
77b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
77c0: 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a  , OP_If, reg3);.
77d0: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
77e0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
77f0: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
7800: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
7810: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
7820: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
7830: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
7840: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7850: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65  OP_Integer, file
7860: 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20  Format, reg3);. 
7870: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7880: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
7890: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
78a0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65  _FILE_FORMAT, re
78b0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
78c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
78d0: 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62  _Integer, ENC(db
78e0: 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  ), reg3);.    sq
78f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7900: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
7910: 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54   iDb, BTREE_TEXT
7920: 5f 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29  _ENCODING, reg3)
7930: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7940: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
7950: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a  ;..    /* This j
7960: 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c  ust creates a pl
7970: 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72  ace-holder recor
7980: 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  d in the sqlite_
7990: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
79a0: 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20    ** The record 
79b0: 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74  created does not
79c0: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e   contain anythin
79d0: 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20  g yet.  It will 
79e0: 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20  be replaced.    
79f0: 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65  ** by the real e
7a00: 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e  ntry in code gen
7a10: 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65  erated at sqlite
7a20: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20  3EndTable()..   
7a30: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
7a40: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77  owid for the new
7a50: 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69   entry is left i
7a60: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
7a70: 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20  e->regRowid..   
7a80: 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   ** The root pag
7a90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
7aa0: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66  new table is lef
7ab0: 74 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d  t in reg pParse-
7ac0: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
7ad0: 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72   The rowid and r
7ae0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
7af0: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65  values are neede
7b00: 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  d by the code th
7b10: 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  at.    ** sqlite
7b20: 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67  3EndTable will g
7b30: 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a  enerate..    */.
7b40: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
7b50: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
7b60: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
7b70: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7b80: 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56  BLE).    if( isV
7b90: 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c  iew || isVirtual
7ba0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7bb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7bc0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
7bd0: 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g2);.    }else.#
7be0: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
7bf0: 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72    pParse->addrCr
7c00: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Tab = sqlite3Vdb
7c10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72  eAddOp2(v, OP_Cr
7c20: 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20  eateTable, iDb, 
7c30: 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  reg2);.    }.   
7c40: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
7c50: 65 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  erTable(pParse, 
7c60: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
7c70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7c80: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72  P_NewRowid, 0, r
7c90: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
7ca0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7cb0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29  P_Null, 0, reg3)
7cc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7cd0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7ce0: 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72  sert, 0, reg3, r
7cf0: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
7d00: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
7d10: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
7d20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7d30: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp0(v, OP_Clo
7d40: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  se);.  }..  /* N
7d50: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
7d60: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
7d70: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
7d80: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
7d90: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
7da0: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
7db0: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
7dc0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
7dd0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
7de0: 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  ** This macro is
7df0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
7e00: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20   two strings in 
7e10: 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  a case-insensiti
7e20: 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74  ve manner..** It
7e30: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73   is slightly fas
7e40: 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67  ter than calling
7e50: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
7e60: 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a  ) directly, but.
7e70: 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67  ** produces larg
7e80: 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57  er code..**.** W
7e90: 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63  ARNING: This mac
7ea0: 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74  ro is not compat
7eb0: 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 74  ible with the st
7ec0: 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49  rcmp() family. I
7ed0: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75  t.** returns tru
7ee0: 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74 72  e if the two str
7ef0: 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20  ings are equal, 
7f00: 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e  otherwise false.
7f10: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49  .*/.#define STRI
7f20: 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c  CMP(x, y) (\.sql
7f30: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
7f40: 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [*(unsigned char
7f50: 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71   *)(x)]==   \.sq
7f60: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
7f70: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
7f80: 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26  r *)(y)]     \.&
7f90: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
7fa0: 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30  ((x)+1,(y)+1)==0
7fb0: 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20   )../*.** Add a 
7fc0: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
7fd0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
7fe0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
7ff0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
8000: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
8010: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
8020: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
8030: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
8040: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8050: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
8060: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
8070: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
8080: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
8090: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
80a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
80b0: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
80c0: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
80d0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
80e0: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
80f0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
8100: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
8110: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
8120: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
8130: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8140: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
8150: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
8160: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
8170: 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49  return;.#if SQLI
8180: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
8190: 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62  if( p->nCol+1>db
81a0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
81b0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
81c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
81d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
81e0: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f  o many columns o
81f0: 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  n %s", p->zName)
8200: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8210: 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73  }.#endif.  z = s
8220: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
8230: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
8240: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
8250: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
8260: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
8270: 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d 50  .    if( STRICMP
8280: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
8290: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
82a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
82b0: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
82c0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
82d0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
82e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
82f0: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
8300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8310: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
8320: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
8330: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
8340: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
8350: 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c  alloc(db,p->aCol
8360: 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a  ,(p->nCol+8)*siz
8370: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
8380: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
8390: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
83a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
83b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
83c0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c     }.    p->aCol
83d0: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
83e0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
83f0: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
8400: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
8410: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
8420: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
8430: 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65  z;. .  /* If the
8440: 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70  re is no type sp
8450: 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73  ecified, columns
8460: 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c   have the defaul
8470: 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20  t affinity.  ** 
8480: 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65  'NONE'. If there
8490: 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69   is a type speci
84a0: 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74  fied, then sqlit
84b0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
84c0: 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63  ) will.  ** be c
84d0: 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65  alled next to se
84e0: 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  t pCol->affinity
84f0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
8500: 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  .  pCol->affinit
8510: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
8520: 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45  ONE;.  pCol->szE
8530: 73 74 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f  st = 1;.  p->nCo
8540: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
8550: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8560: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
8570: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8580: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8590: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
85a0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
85b0: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
85c0: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
85d0: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
85e0: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
85f0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
8600: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
8610: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
8620: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
8630: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
8640: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
8650: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
8660: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
8670: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20    Table *p;.  p 
8680: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8690: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
86a0: 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c  || NEVER(p->nCol
86b0: 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <1) ) return;.  
86c0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
86d0: 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38  1].notNull = (u8
86e0: 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  )onError;.}../*.
86f0: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
8700: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
8710: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
8720: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
8730: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
8740: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a  ffinity type..**
8750: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8760: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64   does a case-ind
8770: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20  ependent search 
8780: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  of zType for the
8790: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20   .** substrings 
87a0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
87b0: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f   table. If one o
87c0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
87d0: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
87e0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
87f0: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75  affinity is retu
8800: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63  rned. If zType c
8810: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20  ontains.** more 
8820: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  than one of the 
8830: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72  substrings, entr
8840: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74  ies toward the t
8850: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61  op of .** the ta
8860: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74  ble take priorit
8870: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
8880: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f  if zType is 'BLO
8890: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54  BINT', .** SQLIT
88a0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73  E_AFF_INTEGER is
88b0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
88c0: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c   Substring     |
88d0: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d   Affinity.** ---
88e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
8900: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c   'INT'         |
8910: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
8920: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20  GER.** 'CHAR'   
8930: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8940: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27  F_TEXT.** 'CLOB'
8950: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8960: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45  _AFF_TEXT.** 'TE
8970: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  XT'        | SQL
8980: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
8990: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'BLOB'        | 
89a0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
89b0: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20  ** 'REAL'       
89c0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
89d0: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20  AL.** 'FLOA'    
89e0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
89f0: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20  _REAL.** 'DOUB' 
8a00: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8a10: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49  AFF_REAL.**.** I
8a20: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
8a30: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
8a40: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
8a50: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
8a60: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
8a70: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
8a80: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
8a90: 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  yType(const char
8aa0: 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73   *zIn, u8 *pszEs
8ab0: 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b  t){.  u32 h = 0;
8ac0: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51  .  char aff = SQ
8ad0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8ae0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
8af0: 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66  zChar = 0;..  if
8b00: 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72  ( zIn==0 ) retur
8b10: 6e 20 61 66 66 3b 0a 20 20 77 68 69 6c 65 28 20  n aff;.  while( 
8b20: 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20  zIn[0] ){.    h 
8b30: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
8b40: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28  e3UpperToLower[(
8b50: 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20  *zIn)&0xff];.   
8b60: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
8b70: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
8b80: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
8b90: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
8ba0: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
8bb0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8bc0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
8bd0: 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a     zChar = zIn;.
8be0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8bf0: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
8c00: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
8c10: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
8c20: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
8c30: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
8c40: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
8c50: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
8c60: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
8c70: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
8c80: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
8c90: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8ca0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
8cb0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
8cc0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
8cd0: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
8ce0: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
8cf0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
8d00: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
8d10: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
8d20: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
8d30: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8d40: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
8d50: 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d       if( zIn[0]=
8d60: 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a  ='(' ) zChar = z
8d70: 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  In;.#ifndef SQLI
8d80: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
8d90: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
8da0: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
8db0: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
8dc0: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
8dd0: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
8de0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
8df0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8e00: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
8e10: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8e20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8e30: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
8e40: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8e50: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
8e60: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
8e70: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8e80: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8e90: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8ea0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
8eb0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8ec0: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
8ed0: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
8ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
8ef0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
8f00: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8f10: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
8f20: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8f30: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
8f40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
8f50: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
8f60: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
8f70: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
8f80: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
8f90: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
8fa0: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
8fb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
8fc0: 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69 73 20  /* If pszEst is 
8fd0: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20  not NULL, store 
8fe0: 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
8ff0: 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20  he field size.  
9000: 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74  The.  ** estimat
9010: 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74  e is scaled so t
9020: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
9030: 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e  an integer is 1.
9040: 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45 73    */.  if( pszEs
9050: 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74  t ){.    *pszEst
9060: 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66 61 75   = 1;   /* defau
9070: 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f  lt size is appro
9080: 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20  x 4 bytes */.   
9090: 20 69 66 28 20 61 66 66 3c 3d 53 51 4c 49 54 45   if( aff<=SQLITE
90a0: 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
90b0: 20 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a     if( zChar ){.
90c0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
90d0: 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  Char[0] ){.     
90e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
90f0: 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d  Isdigit(zChar[0]
9100: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
9110: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20 20   int v = 0;.    
9120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
9130: 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26  etInt32(zChar, &
9140: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
9150: 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20  v = v/4 + 1;.   
9160: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 32           if( v>2
9170: 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20  55 ) v = 255;.  
9180: 20 20 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73            *pszEs
9190: 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b  t = v; /* BLOB(k
91a0: 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43  ), VARCHAR(k), C
91b0: 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34  HAR(k) -> r=(k/4
91c0: 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  +1) */.         
91d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
91e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
91f0: 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20  zChar++;.       
9200: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
9210: 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20          *pszEst 
9220: 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20  = 5;   /* BLOB, 
9230: 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d  TEXT, CLOB -> r=
9240: 35 20 20 28 61 70 70 72 6f 78 20 32 30 20 62 79  5  (approx 20 by
9250: 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  tes)*/.      }. 
9260: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9270: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
9280: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9290: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
92a0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
92b0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
92c0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
92d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
92e0: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
92f0: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
9300: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
9310: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
9320: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
9330: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
9340: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
9350: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9360: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
9370: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
9380: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
9390: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
93a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
93b0: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
93c0: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
93d0: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
93e0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
93f0: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
9400: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
9410: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
9420: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
9430: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
9440: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
9450: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
9460: 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d  mn *pCol;..  p =
9470: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9480: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
9490: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
94a0: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
94b0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
94c0: 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73  ->nCol-1];.  ass
94d0: 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  ert( pCol->zType
94e0: 3d 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  ==0 );.  pCol->z
94f0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Type = sqlite3Na
9500: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
9510: 73 65 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a  se->db, pType);.
9520: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
9530: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
9540: 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79  tyType(pCol->zTy
9550: 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74  pe, &pCol->szEst
9560: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
9570: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
9580: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
9590: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
95a0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
95b0: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
95c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
95d0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
95e0: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
95f0: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
9600: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
9610: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
9620: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
9630: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
9640: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9650: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9660: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
9670: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
9680: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
9690: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
96a0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
96b0: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
96c0: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
96d0: 70 50 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e  pParse, ExprSpan
96e0: 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c   *pSpan){.  Tabl
96f0: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
9700: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
9710: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9720: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
9730: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
9740: 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f   p!=0 ){.    pCo
9750: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
9760: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
9770: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
9780: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9790: 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72  ion(pSpan->pExpr
97a0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
97b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
97c0: 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75  e, "default valu
97d0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d  e of column [%s]
97e0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
97f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
9800: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
9810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
9820: 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69   copy of pExpr i
9830: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  s used instead o
9840: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20  f the original, 
9850: 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e  as pExpr contain
9860: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e  s.      ** token
9870: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
9880: 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e  volatile memory.
9890: 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74   The 'span' of t
98a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
98b0: 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
98c0: 65 64 20 62 79 20 70 72 61 67 6d 61 20 74 61 62  ed by pragma tab
98d0: 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a  le_info..      *
98e0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
98f0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
9900: 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20  ol->pDflt);.    
9910: 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20    pCol->pDflt = 
9920: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
9930: 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c  b, pSpan->pExpr,
9940: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
9950: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
9960: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
9970: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43  zDflt);.      pC
9980: 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69  ol->zDflt = sqli
9990: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
99a0: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
99b0: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
99e0: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
99f0: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
9a00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
9a10: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
9a20: 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29  b, pSpan->pExpr)
9a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  ;.}../*.** Desig
9a40: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
9a50: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
9a60: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
9a70: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
9a80: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
9a90: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
9aa0: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
9ab0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
9ac0: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
9ad0: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
9ae0: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
9af0: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
9b00: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
9b10: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
9b20: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
9b30: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
9b40: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
9b50: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
9b60: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
9b70: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
9b80: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
9b90: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
9ba0: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
9bb0: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
9bc0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
9bd0: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
9be0: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
9bf0: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
9c00: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
9c10: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
9c20: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
9c30: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
9c40: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
9c50: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
9c60: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
9c70: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
9c80: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
9c90: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
9ca0: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
9cb0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
9cc0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
9cd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
9ce0: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
9cf0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
9d00: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
9d10: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
9d20: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
9d30: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
9d40: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
9d50: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
9d60: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
9d70: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
9d80: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
9d90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9da0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
9db0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
9dc0: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
9dd0: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
9de0: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
9df0: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
9e00: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
9e10: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
9e20: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
9e30: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
9e40: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
9e50: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
9e60: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
9e70: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
9e80: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
9e90: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
9ea0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
9eb0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9ec0: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79  ble;.  char *zTy
9ed0: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  pe = 0;.  int iC
9ee0: 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e  ol = -1, i;.  in
9ef0: 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20 70  t nTerm;.  if( p
9f00: 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  Tab==0 || IN_DEC
9f10: 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
9f20: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
9f30: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
9f40: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
9f50: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
9f60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9f70: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
9f80: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
9f90: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
9fa0: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
9fb0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
9fc0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
9fd0: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
9fe0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
9ff0: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
a000: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
a010: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
a020: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
a030: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
a040: 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol].colFlags |= 
a050: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b  COLFLAG_PRIMKEY;
a060: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
a070: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
a080: 79 70 65 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  ype;.    nTerm =
a090: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
a0a0: 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e   nTerm = pList->
a0b0: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
a0c0: 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
a0d0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
a0e0: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
a0f0: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
a100: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
a110: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
a120: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
a130: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
a140: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
a150: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
a160: 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c  iCol].colFlags |
a170: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
a180: 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  Y;.          zTy
a190: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
a1a0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
a1b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a1d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
a1e0: 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 7a  nTerm==1.   && z
a1f0: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
a200: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
a210: 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26  NTEGER")==0.   &
a220: 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  & sortOrder==SQL
a230: 49 54 45 5f 53 4f 5f 41 53 43 0a 20 20 29 7b 0a  ITE_SO_ASC.  ){.
a240: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
a250: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
a260: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29  ->keyConf = (u8)
a270: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  onError;.    ass
a280: 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20  ert( autoInc==0 
a290: 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b  || autoInc==1 );
a2a0: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
a2b0: 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54  ags |= autoInc*T
a2c0: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  F_Autoincrement;
a2d0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
a2e0: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
a2f0: 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61  Order = pList->a
a300: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [0].sortOrder;. 
a310: 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49   }else if( autoI
a320: 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  nc ){.#ifndef SQ
a330: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
a340: 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69  CREMENT.    sqli
a350: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a360: 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45  se, "AUTOINCREME
a370: 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  NT is only allow
a380: 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20  ed on an ".     
a390: 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41    "INTEGER PRIMA
a3a0: 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66  RY KEY");.#endif
a3b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
a3c0: 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  dex *p;.    p = 
a3d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
a3e0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
a3f0: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
a400: 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  or, 0,.         
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20    0, sortOrder, 
a430: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  0);.    if( p ){
a440: 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 49 6e  .      p->autoIn
a450: 64 65 78 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  dex = 2;.    }. 
a460: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
a470: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
a480: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
a490: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
a4a0: 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
a4b0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
a4c0: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48  .** Add a new CH
a4d0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ECK constraint t
a4e0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
a4f0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
a500: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
a510: 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63  d sqlite3AddChec
a520: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  kConstraint(.  P
a530: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a540: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
a550: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
a560: 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68  CheckExpr  /* Th
a570: 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  e check expressi
a580: 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  on */.){.#ifndef
a590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
a5a0: 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  CK.  Table *pTab
a5b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
a5c0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62  able;.  if( pTab
a5d0: 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f   && !IN_DECLARE_
a5e0: 56 54 41 42 20 29 7b 0a 20 20 20 20 70 54 61 62  VTAB ){.    pTab
a5f0: 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74  ->pCheck = sqlit
a600: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
a610: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70  (pParse, pTab->p
a620: 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70  Check, pCheckExp
a630: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  r);.    if( pPar
a640: 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61  se->constraintNa
a650: 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71  me.n ){.      sq
a660: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
a670: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61  Name(pParse, pTa
a680: 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72  b->pCheck, &pPar
a690: 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61  se->constraintNa
a6a0: 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 1);.    }.  
a6b0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
a6c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
a6d0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
a6e0: 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a  b, pCheckExpr);.
a6f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
a700: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
a710: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  unction of the m
a720: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
a730: 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  sed table column
a740: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53  .** to the CollS
a750: 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  eq given..*/.voi
a760: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
a770: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
a780: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
a790: 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oken){.  Table *
a7a0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
a7b0: 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
a7c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f          /* Dequo
a7d0: 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c  ted name of coll
a7e0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a  ation sequence *
a7f0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
a800: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
a810: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
a820: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
a830: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
a840: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a850: 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  zColl = sqlit
a860: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
a870: 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
a880: 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
a890: 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  rn;..  if( sqlit
a8a0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
a8b0: 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29  pParse, zColl) )
a8c0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
a8d0: 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  x;.    sqlite3Db
a8e0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
a8f0: 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  [i].zColl);.    
a900: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
a910: 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20   = zColl;.  .   
a920: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
a930: 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73  n is declared as
a940: 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59   "<name> PRIMARY
a950: 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79   KEY COLLATE <ty
a960: 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65  pe>",.    ** the
a970: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
a980: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
a990: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
a9a0: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
a9b0: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
a9c0: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
a9d0: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
a9e0: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
a9f0: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  */.    for(pIdx=
aa00: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
aa10: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
aa20: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
aa30: 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d  ( pIdx->nKeyCol=
aa40: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
aa50: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
aa60: 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==i ){.        
aa70: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20  pIdx->azColl[0] 
aa80: 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  = p->aCol[i].zCo
aa90: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
aaa0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
aab0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
aac0: 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a   zColl);.  }.}..
aad0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
aae0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
aaf0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
ab00: 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  ce for database 
ab10: 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65  native text.** e
ab20: 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69  ncoding identifi
ab30: 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67  ed by the string
ab40: 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e   zName, length n
ab50: 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Name..**.** If t
ab60: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
ab70: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
ab80: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
ab90: 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62  , or not availab
aba0: 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  le.** in the dat
abb0: 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63  abase native enc
abc0: 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61  oding, the colla
abd0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20  tion factory is 
abe0: 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65  invoked to.** re
abf0: 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65  quest it. If the
ac00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
ac10: 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ry does not supp
ac20: 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e  ly such a sequen
ac30: 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  ce,.** and the s
ac40: 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c  equence is avail
ac50: 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20  able in another 
ac60: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74  text encoding, t
ac70: 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72  hen that is.** r
ac80: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
ac90: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72  .**.** If no ver
aca0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71  sions of the req
acb0: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
acc0: 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61  s sequence are a
acd0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20  vailable, or.** 
ace0: 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  another error oc
acf0: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
ad00: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
ad10: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74  ror message writ
ad20: 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72  ten into.** pPar
ad30: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
ad40: 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70  outine is a wrap
ad50: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
ad60: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e  e3FindCollSeq().
ad70: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
ad80: 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f  * invokes the co
ad90: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
ada0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c  if the named col
adb0: 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  lation cannot be
adc0: 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65   found.** and ge
add0: 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72  nerates an error
ade0: 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
adf0: 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65  See also: sqlite
ae00: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20  3FindCollSeq(), 
ae10: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
ae20: 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  q().*/.CollSeq *
ae30: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
ae40: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
ae50: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
ae60: 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65  zName){.  sqlite
ae70: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
ae80: 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45  db;.  u8 enc = E
ae90: 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69  NC(db);.  u8 ini
aea0: 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74  tbusy = db->init
aeb0: 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71  .busy;.  CollSeq
aec0: 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c   *pColl;..  pCol
aed0: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
aee0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
aef0: 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29  zName, initbusy)
af00: 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  ;.  if( !initbus
af10: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
af20: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
af30: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
af40: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70  ite3GetCollSeq(p
af50: 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c  Parse, enc, pCol
af60: 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a  l, zName);.  }..
af70: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
af80: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
af90: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
afa0: 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  l increment the 
afb0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a  schema cookie..*
afc0: 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20  *.** The schema 
afd0: 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74  cookie is used t
afe0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e  o determine when
aff0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
b000: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
b010: 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20  changes.  After 
b020: 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e  each schema chan
b030: 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  ge, the cookie v
b040: 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  alue.** changes.
b050: 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73    When a process
b060: 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65   first reads the
b070: 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72   schema it recor
b080: 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  ds the.** cookie
b090: 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77  .  Thereafter, w
b0a0: 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20  henever it goes 
b0b0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
b0c0: 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68  tabase,.** it ch
b0d0: 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ecks the cookie 
b0e0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
b0f0: 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
b100: 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65  changed.** since
b110: 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61   it was last rea
b120: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c  d..**.** This pl
b130: 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  an is not comple
b140: 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f  tely bullet-proo
b150: 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62  f.  It is possib
b160: 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63  le for.** the sc
b170: 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d  hema to change m
b180: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e  ultiple times an
b190: 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65  d for the cookie
b1a0: 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61   to be.** set ba
b1b0: 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75  ck to prior valu
b1c0: 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63  e.  But schema c
b1d0: 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65  hanges are infre
b1e0: 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65  quent.** and the
b1f0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
b200: 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65  hitting the same
b210: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73   cookie value is
b220: 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63   only.** 1 chanc
b230: 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77  e in 2^32.  So w
b240: 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68  e're safe enough
b250: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b260: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61  3ChangeCookie(Pa
b270: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
b280: 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20   iDb){.  int r1 
b290: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b2a0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
b2b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b2c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
b2d0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
b2e0: 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  be;.  assert( sq
b2f0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
b300: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
b310: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
b320: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
b330: 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69  teger, db->aDb[i
b340: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
b350: 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31  ema_cookie+1, r1
b360: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b370: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
b380: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
b390: 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  EE_SCHEMA_VERSIO
b3a0: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
b3b0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
b3c0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
b3d0: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
b3e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
b3f0: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
b400: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
b410: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
b420: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
b430: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
b440: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
b450: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
b460: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
b470: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
b480: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
b490: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
b4a0: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
b4b0: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
b4c0: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
b4d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
b4e0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
b4f0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
b500: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
b510: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
b520: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
b530: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
b540: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
b550: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
b560: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
b570: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
b580: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
b590: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
b5a0: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
b5b0: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
b5c0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
b5d0: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
b5e0: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
b5f0: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
b600: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
b610: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
b620: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
b630: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
b640: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
b650: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
b660: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
b670: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
b680: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
b690: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
b6a0: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
b6b0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
b6c0: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
b6d0: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
b6e0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
b6f0: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
b700: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
b710: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
b720: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
b730: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
b740: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
b750: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
b760: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
b770: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
b780: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
b790: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
b7a0: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
b7b0: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
b7c0: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
b7d0: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
b7e0: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
b7f0: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
b800: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
b810: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
b820: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
b830: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
b840: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
b850: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
b860: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
b870: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
b880: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
b890: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
b8a0: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
b8b0: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
b8c0: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
b8d0: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
b8e0: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
b8f0: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
b900: 28 7a 49 64 65 6e 74 5b 30 5d 29 20 7c 7c 20 73  (zIdent[0]) || s
b910: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
b920: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
b930: 5f 49 44 3b 0a 20 20 69 66 28 20 21 6e 65 65 64  _ID;.  if( !need
b940: 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 6e 65 65  Quote ){.    nee
b950: 64 51 75 6f 74 65 20 3d 20 7a 49 64 65 6e 74 5b  dQuote = zIdent[
b960: 6a 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  j];.  }..  if( n
b970: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
b980: 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a  ] = '"';.  for(j
b990: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
b9a0: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
b9b0: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
b9c0: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
b9d0: 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  '"' ) z[i++] = '
b9e0: 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  "';.  }.  if( ne
b9f0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
ba00: 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d   = '"';.  z[i] =
ba10: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
ba20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
ba30: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
ba40: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
ba50: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
ba60: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
ba70: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
ba80: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
ba90: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
baa0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
bab0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
bac0: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
bad0: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
bae0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
baf0: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
bb00: 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20  bleStmt(sqlite3 
bb10: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
bb20: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
bb30: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
bb40: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
bb50: 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c  p2, *zEnd;.  Col
bb60: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
bb70: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
bb80: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
bb90: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
bba0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
bbb0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
bbc0: 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20  l->zName) + 5;. 
bbd0: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
bbe0: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
bbf0: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a  .  if( n<50 ){ .
bc00: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
bc10: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
bc20: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
bc30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
bc40: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
bc50: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
bc60: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
bc70: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
bc80: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
bc90: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44  zStmt = sqlite3D
bca0: 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29  bMallocRaw(0, n)
bcb0: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
bcc0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
bcd0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
bce0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
bcf0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
bd00: 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52  tf(n, zStmt, "CR
bd10: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
bd20: 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   k = sqlite3Strl
bd30: 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69  en30(zStmt);.  i
bd40: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
bd50: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
bd60: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
bd70: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
bd80: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
bd90: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
bda0: 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  +){.    static c
bdb0: 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
bdc0: 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20  t azType[] = {. 
bdd0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
bde0: 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20  _AFF_TEXT    */ 
bdf0: 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20  " TEXT",.       
be00: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   /* SQLITE_AFF_N
be10: 4f 4e 45 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20  ONE    */ "",.  
be20: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
be30: 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22  AFF_NUMERIC */ "
be40: 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f   NUM",.        /
be50: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
be60: 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a  EGER */ " INT",.
be70: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
be80: 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f  E_AFF_REAL    */
be90: 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a   " REAL".    };.
bea0: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
beb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
bec0: 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
bed0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
bee0: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
bef0: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
bf00: 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74  3Strlen30(&zStmt
bf10: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
bf20: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
bf30: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
bf40: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
bf50: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
bf60: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
bf70: 41 46 46 5f 54 45 58 54 20 3e 3d 20 30 20 29 3b  AFF_TEXT >= 0 );
bf80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
bf90: 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49  l->affinity-SQLI
bfa0: 54 45 5f 41 46 46 5f 54 45 58 54 20 3c 20 41 72  TE_AFF_TEXT < Ar
bfb0: 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20  raySize(azType) 
bfc0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
bfd0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
bfe0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
bff0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c000: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c010: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
c020: 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
c030: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c040: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
c050: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73  MERIC );.    tes
c060: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c070: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c080: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
c090: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c0a0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c0b0: 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20  E_AFF_REAL );.  
c0c0: 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61    .    zType = a
c0d0: 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69  zType[pCol->affi
c0e0: 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46  nity - SQLITE_AF
c0f0: 46 5f 54 45 58 54 5d 3b 0a 20 20 20 20 6c 65 6e  F_TEXT];.    len
c100: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
c110: 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61  30(zType);.    a
c120: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
c130: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c140: 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20 20  F_NONE .        
c150: 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66      || pCol->aff
c160: 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66  inity==sqlite3Af
c170: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
c180: 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63  , 0) );.    memc
c190: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54  py(&zStmt[k], zT
c1a0: 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b  ype, len);.    k
c1b0: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73   += len;.    ass
c1c0: 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d  ert( k<=n );.  }
c1d0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
c1e0: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
c1f0: 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b  k], "%s", zEnd);
c200: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
c210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65  .}../*.** Resize
c220: 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
c230: 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d   to hold N colum
c240: 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72  ns total.  Retur
c250: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
c260: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51  n success and SQ
c270: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e  LITE_NOMEM on an
c280: 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73   OOM error..*/.s
c290: 74 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65  tatic int resize
c2a0: 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69  IndexObject(sqli
c2b0: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
c2c0: 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  pIdx, int N){.  
c2d0: 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20  char *zExtra;.  
c2e0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
c2f0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
c300: 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  N ) return SQLIT
c310: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
c320: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d  pIdx->isResized=
c330: 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20  =0 );.  nByte = 
c340: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b  (sizeof(char*) +
c350: 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31   sizeof(i16) + 1
c360: 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20  )*N;.  zExtra = 
c370: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c380: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
c390: 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20    if( zExtra==0 
c3a0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c3b0: 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28  NOMEM;.  memcpy(
c3c0: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a  zExtra, pIdx->az
c3d0: 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61  Coll, sizeof(cha
c3e0: 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r*)*pIdx->nColum
c3f0: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  n);.  pIdx->azCo
c400: 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 7a 45 78  ll = (char**)zEx
c410: 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
c420: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e   sizeof(char*)*N
c430: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
c440: 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  a, pIdx->aiColum
c450: 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70  n, sizeof(i16)*p
c460: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
c470: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20   pIdx->aiColumn 
c480: 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a  = (i16*)zExtra;.
c490: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
c4a0: 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d  of(i16)*N;.  mem
c4b0: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
c4c0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49  ->aSortOrder, pI
c4d0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
c4e0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
c4f0: 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a   = (u8*)zExtra;.
c500: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
c510: 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52  = N;.  pIdx->isR
c520: 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65  esized = 1;.  re
c530: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c540: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
c550: 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20  e the total row 
c560: 77 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c  width for a tabl
c570: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
c580: 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57  d estimateTableW
c590: 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62  idth(Table *pTab
c5a0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54  ){.  unsigned wT
c5b0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  able = 0;.  cons
c5c0: 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f  t Column *pTabCo
c5d0: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  l;.  int i;.  fo
c5e0: 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  r(i=pTab->nCol, 
c5f0: 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  pTabCol=pTab->aC
c600: 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  ol; i>0; i--, pT
c610: 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54  abCol++){.    wT
c620: 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d  able += pTabCol-
c630: 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66  >szEst;.  }.  if
c640: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
c650: 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54  ) wTable++;.  pT
c660: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
c670: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61  qlite3LogEst(wTa
c680: 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ble*4);.}../*.**
c690: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
c6a0: 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20  erage size of a 
c6b0: 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  row for an index
c6c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c6d0: 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
c6e0: 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29  dth(Index *pIdx)
c6f0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e  {.  unsigned wIn
c700: 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  dex = 0;.  int i
c710: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
c720: 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70   *aCol = pIdx->p
c730: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66  Table->aCol;.  f
c740: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
c750: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
c760: 20 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d     i16 x = pIdx-
c770: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
c780: 20 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78    assert( x<pIdx
c790: 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29  ->pTable->nCol )
c7a0: 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20  ;.    wIndex += 
c7b0: 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70  x<0 ? 1 : aCol[p
c7c0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
c7d0: 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70  ].szEst;.  }.  p
c7e0: 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20  Idx->szIdxRow = 
c7f0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49  sqlite3LogEst(wI
c800: 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52  ndex*4);.}../* R
c810: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61  eturn true if va
c820: 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61  lue x is found a
c830: 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ny of the first 
c840: 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20  nCol entries of 
c850: 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69  aiCol[].*/.stati
c860: 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28  c int hasColumn(
c870: 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c  const i16 *aiCol
c880: 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20  , int nCol, int 
c890: 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f  x){.  while( nCo
c8a0: 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d  l-- > 0 ) if( x=
c8b0: 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65  =*(aiCol++) ) re
c8c0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
c8d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   0;.}../*.** The
c8e0: 20 74 61 62 6c 65 20 70 54 61 62 20 68 61 73 20   table pTab has 
c8f0: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
c900: 63 6c 61 75 73 65 20 61 74 20 74 68 65 20 65 6e  clause at the en
c910: 64 2e 20 20 47 6f 20 74 68 72 6f 75 67 68 20 61  d.  Go through a
c920: 6e 64 0a 2a 2a 20 6d 61 6b 65 20 61 6c 6c 20 74  nd.** make all t
c930: 68 65 20 63 68 61 6e 67 65 73 20 6e 65 63 65 73  he changes neces
c940: 73 61 72 79 20 74 6f 20 6d 61 6b 65 20 74 68 69  sary to make thi
c950: 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
c960: 44 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  D table..**.**  
c970: 20 20 20 28 31 29 20 20 43 6f 6e 76 65 72 74 20     (1)  Convert 
c980: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62  the OP_CreateTab
c990: 6c 65 20 69 6e 74 6f 20 61 6e 20 6e 6f 2d 6f 70  le into an no-op
c9a0: 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 4d 61  ..**     (2)  Ma
c9b0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 61 62 6c  ke sure all tabl
c9c0: 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61  e columns are pa
c9d0: 72 74 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  rt of the PRIMAR
c9e0: 59 20 4b 45 59 0a 2a 2a 20 20 20 20 20 28 33 29  Y KEY.**     (3)
c9f0: 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20    Make sure all 
ca00: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
ca10: 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20  mns are part of 
ca20: 61 6c 6c 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20  all UNIQUE.**   
ca30: 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 0a 2a         indices.*
ca40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
ca50: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
ca60: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
ca70: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
ca80: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
ca90: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
caa0: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
cab0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
cac0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
cad0: 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  ->db;..  /* Conv
cae0: 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74  ert the OP_Creat
caf0: 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 74 68  eTable opcode th
cb00: 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  at would normall
cb10: 79 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 2a  y create the.  *
cb20: 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f 72 20  * root-page for 
cb30: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 61  the table into a
cb40: 20 4f 50 5f 4e 75 6c 6c 20 6f 70 63 6f 64 65 2e   OP_Null opcode.
cb50: 20 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20    This prevents 
cb60: 74 68 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  the.  ** allocat
cb70: 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  ion of the root-
cb80: 70 61 67 65 20 28 77 68 69 63 68 20 77 6f 75 6c  page (which woul
cb90: 64 20 6e 65 76 65 72 20 62 65 65 6e 20 75 73 65  d never been use
cba0: 64 2c 20 61 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  d, as all.  ** c
cbb0: 6f 6e 74 65 6e 74 20 69 73 20 73 74 6f 72 65 64  ontent is stored
cbc0: 20 69 6e 20 74 68 65 20 70 72 69 6d 61 72 79 2d   in the primary-
cbd0: 6b 65 79 20 69 6e 64 65 78 20 69 6e 73 74 65 61  key index instea
cbe0: 64 29 20 61 6e 64 20 69 74 20 63 61 75 73 65 73  d) and it causes
cbf0: 0a 20 20 2a 2a 20 61 20 4e 55 4c 4c 20 76 61 6c  .  ** a NULL val
cc00: 75 65 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ue in the sqlite
cc10: 5f 6d 61 73 74 65 72 2e 72 6f 6f 74 70 61 67 65  _master.rootpage
cc20: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 63   field of the sc
cc30: 68 65 6d 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hema..  */.  if(
cc40: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
cc50: 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
cc60: 33 56 64 62 65 47 65 74 4f 70 28 70 50 61 72 73  3VdbeGetOp(pPars
cc70: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
cc80: 2d 3e 61 64 64 72 43 72 54 61 62 29 2d 3e 6f 70  ->addrCrTab)->op
cc90: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
cca0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
ccb0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
ccc0: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
ccd0: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
cce0: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
ccf0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
cd00: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
cd10: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
cd20: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
cd30: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
cd40: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
cd50: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
cd60: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
cd70: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
cd80: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b  d(pParse, 0, 0);
cd90: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
cda0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
cdb0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pList->a[0].zNam
cdc0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
cdd0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  Dup(pParse->db,.
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
ce10: 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
ce20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
ce30: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
ce40: 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  r = pParse->iPkS
ce50: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73  ortOrder;.    as
ce60: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
ce70: 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  ewTable==pTab );
ce80: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
ce90: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
cea0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
ceb0: 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43  List, pTab->keyC
cec0: 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  onf, 0, 0, 0, 0)
ced0: 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 30  ;.    if( pPk==0
cee0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
cef0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
cf00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
cf10: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
cf20: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
cf30: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
cf40: 70 50 6b 21 3d 30 20 29 3b 0a 20 20 6e 50 6b 20  pPk!=0 );.  nPk 
cf50: 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  = pPk->nKeyCol;.
cf60: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
cf70: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
cf80: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
cf90: 69 73 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20  is NOT NULL */. 
cfa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b   for(i=0; i<nPk;
cfb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 54 61 62 2d   i++){.    pTab-
cfc0: 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c  >aCol[pPk->aiCol
cfd0: 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20  umn[i]].notNull 
cfe0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e  = 1;.  }.  pPk->
cff0: 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b  uniqNotNull = 1;
d000: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
d010: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
d020: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  esentation of al
d030: 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73  l UNIQUE indices
d040: 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20   by converting. 
d050: 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   ** the final ro
d060: 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20  wid column into 
d070: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  one or more colu
d080: 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41  mns of the PRIMA
d090: 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66  RY KEY..  */.  f
d0a0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
d0b0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
d0c0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
d0d0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66     int n;.    if
d0e0: 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65  ( pIdx->autoInde
d0f0: 78 3d 3d 32 20 29 20 63 6f 6e 74 69 6e 75 65 3b  x==2 ) continue;
d100: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  .    if( pIdx->n
d110: 4b 65 79 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43  KeyCol==pTab->nC
d120: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  ol ){.      pIdx
d130: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
d140: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f  ->nCol;.      co
d150: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
d160: 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e    for(i=n=0; i<n
d170: 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
d180: 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70  if( !hasColumn(p
d190: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70  Idx->aiColumn, p
d1a0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50  Idx->nKeyCol, pP
d1b0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20  k->aiColumn[i]) 
d1c0: 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ) n++;.    }.   
d1d0: 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78   if( resizeIndex
d1e0: 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c  Object(db, pIdx,
d1f0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e   pIdx->nKeyCol+n
d200: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
d210: 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d  for(i=0, j=pIdx-
d220: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b  >nKeyCol; i<nPk;
d230: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
d240: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78   !hasColumn(pIdx
d250: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70  ->aiColumn, j, p
d260: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
d270: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
d280: 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75  rt( j<pPk->nColu
d290: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  mn );.        pI
d2a0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  dx->aiColumn[j] 
d2b0: 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
d2c0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78  i];.        pIdx
d2d0: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50  ->azColl[j] = pP
d2e0: 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  k->azColl[i];.  
d2f0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
d300: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
d310: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
d320: 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73  mn==j );.    ass
d330: 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43  ert( pIdx->nKeyC
d340: 6f 6c 2b 6e 3d 3d 6a 20 29 3b 0a 20 20 7d 0a 0a  ol+n==j );.  }..
d350: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62    /* Add all tab
d360: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
d370: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
d380: 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  dex.  */.  if( n
d390: 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  Pk<pTab->nCol ){
d3a0: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
d3b0: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
d3c0: 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Pk, pTab->nCol) 
d3d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
d3e0: 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c  r(i=0, j=nPk; i<
d3f0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
d400: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
d410: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
d420: 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20  lumn, j, i) ){. 
d430: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
d440: 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  <pPk->nColumn );
d450: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
d460: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20  Column[j] = i;. 
d470: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f         pPk->azCo
d480: 6c 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[j] = "BINARY"
d490: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
d4a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d4b0: 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43   assert( pPk->nC
d4c0: 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20  olumn==j );.    
d4d0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
d4e0: 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  ol==j );.  }.}..
d4f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d500: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
d510: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
d520: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
d530: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
d540: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
d550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
d560: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
d570: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
d580: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
d590: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
d5a0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
d5b0: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
d5c0: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
d5d0: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
d5e0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
d5f0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
d600: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
d610: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
d620: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
d630: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
d640: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
d650: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
d660: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
d670: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
d680: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
d690: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
d6a0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
d6b0: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
d6c0: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
d6d0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
d6e0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
d6f0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
d700: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
d710: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
d720: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
d730: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
d740: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
d750: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
d760: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
d770: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
d780: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
d790: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
d7a0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
d7b0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
d7c0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
d7d0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
d7e0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
d7f0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
d800: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
d810: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
d820: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
d830: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
d840: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
d850: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
d860: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
d870: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
d880: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
d890: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
d8a0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d8b0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
d8c0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
d8d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d8e0: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
d8f0: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
d900: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
d910: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
d920: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20       /* The ')' 
d930: 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69  before options i
d940: 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
d950: 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70  LE */.  u8 tabOp
d960: 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ts,             
d970: 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f  /* Extra table o
d980: 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20  ptions. Usually 
d990: 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  0. */.  Select *
d9a0: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20  pSelect         
d9b0: 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61  /* Select from a
d9c0: 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20   "CREATE ... AS 
d9d0: 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20  SELECT" */.){.  
d9e0: 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20  Table *p;       
d9f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
da00: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
da10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
da20: 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
da30: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
da40: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
da50: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
da60: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
da70: 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62  in which the tab
da80: 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e  le lives */.  In
da90: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
daa0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d          /* An im
dab0: 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74  plied index of t
dac0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69  he table */..  i
dad0: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
dae0: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 64 62  Select==0) || db
daf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
db00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
db10: 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  }.  p = pParse->
db20: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
db30: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
db40: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
db50: 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53  init.busy || !pS
db60: 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 66 28 20  elect );..  if( 
db70: 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74  tabOpts & TF_Wit
db80: 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  houtRowid ){.   
db90: 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
dba0: 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
dbb0: 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  yKey)==0 ){.    
dbc0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
dbd0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 50 52  g(pParse, "no PR
dbe0: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 61  IMARY KEY for ta
dbf0: 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d  ble %s", p->zNam
dc00: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
dc10: 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73       p->tabFlags
dc20: 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f   |= TF_WithoutRo
dc30: 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65  wid;.      conve
dc40: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
dc50: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 29  Table(pParse, p)
dc60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
dc70: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
dc80: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
dc90: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
dca0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dcb0: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
dcc0: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
dcd0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
dce0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
dcf0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
dd00: 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
dd10: 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
dd20: 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c  rence(pParse, p,
dd30: 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20   NC_IsCheck, 0, 
dd40: 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a  p->pCheck);.  }.
dd50: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
dd60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
dd70: 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45  HECK) */..  /* E
dd80: 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72  stimate the aver
dd90: 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72  age row size for
dda0: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66   the table and f
ddb0: 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69  or all implied i
ddc0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69  ndices */.  esti
ddd0: 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 70  mateTableWidth(p
dde0: 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  );.  for(pIdx=p-
ddf0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
de00: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
de10: 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e  {.    estimateIn
de20: 64 65 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a  dexWidth(pIdx);.
de30: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
de40: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
de50: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
de60: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
de70: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
de80: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
de90: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
dea0: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
deb0: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
dec0: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
ded0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
dee0: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
def0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
df00: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
df10: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
df20: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
df30: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
df40: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
df50: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
df60: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
df70: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
df80: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
df90: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
dfa0: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
dfb0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
dfc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
dfd0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
dfe0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
dff0: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
e000: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
e010: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
e020: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
e030: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
e040: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
e050: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
e060: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
e070: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
e080: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
e090: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
e0a0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
e0b0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
e0c0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
e0d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
e0e0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
e0f0: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
e100: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
e110: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
e120: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
e130: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
e140: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
e150: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
e160: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
e170: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
e180: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
e190: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
e1a0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e1b0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
e1c0: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
e1d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e1e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
e1f0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
e200: 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
e210: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
e220: 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
e230: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e240: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
e250: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
e260: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
e270: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
e280: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
e290: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
e2a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e2b0: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
e2c0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
e2d0: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
e2e0: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
e2f0: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
e300: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
e310: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
e320: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
e330: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
e340: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
e350: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
e360: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
e370: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
e380: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
e390: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
e3a0: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
e3b0: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
e3c0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
e3d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
e3e0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
e3f0: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
e400: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
e410: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
e420: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
e430: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
e440: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
e450: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
e460: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
e470: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
e480: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
e490: 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
e4a0: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
e4b0: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
e4c0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
e4d0: 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
e4e0: 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
e4f0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
e500: 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
e510: 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
e520: 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
e530: 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
e540: 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
e550: 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
e560: 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
e570: 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
e580: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
e590: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
e5a0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
e5b0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
e5c0: 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Tab;..      asse
e5d0: 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
e5e0: 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
e5f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e600: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
e610: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
e620: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
e630: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e640: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
e650: 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
e660: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
e670: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
e680: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
e690: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a   SRT_Table, 1);.
e6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
e6b0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
e6c0: 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
e6d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e6e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
e6f0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
e700: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
e710: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
e720: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
e730: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
e740: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
e750: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
e760: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
e770: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e780: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
e790: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
e7a0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
e7b0: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
e7c0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
e7d0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
e7e0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
e7f0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
e800: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
e810: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
e820: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
e830: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
e840: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
e850: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
e860: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
e870: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
e880: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
e890: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
e8a0: 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
e8b0: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
e8c0: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64       Token *pEnd
e8d0: 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70  2 = tabOpts ? &p
e8e0: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
e8f0: 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  n : pEnd;.      
e900: 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d  n = (int)(pEnd2-
e910: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
e920: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
e930: 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30    if( pEnd2->z[0
e940: 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45  ]!=';' ) n += pE
e950: 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53  nd2->n;.      zS
e960: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
e970: 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
e980: 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25      "CREATE %s %
e990: 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
e9a0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
e9b0: 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20  ken.z.      );. 
e9c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73     }..    /* A s
e9d0: 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
e9e0: 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
e9f0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
ea00: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
ea10: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
ea20: 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
ea30: 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
ea40: 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
ea50: 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
ea60: 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
ea70: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
ea80: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
ea90: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
eaa0: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
eab0: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
eac0: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
ead0: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
eae0: 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71  rootpage=#%d, sq
eaf0: 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
eb00: 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c  HERE rowid=#%d",
eb10: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
eb20: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
eb30: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
eb40: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
eb50: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
eb60: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
eb70: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
eb80: 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
eb90: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
eba0: 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
ebb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ebc0: 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
ebd0: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
ebe0: 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
ebf0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ec00: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
ec10: 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
ec20: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
ec30: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
ec40: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
ec50: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
ec60: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
ec70: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
ec80: 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
ec90: 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73   if( p->tabFlags
eca0: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
ecb0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20  ent ){.      Db 
ecc0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
ecd0: 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  iDb];.      asse
ece0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
ecf0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
ed00: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
ed10: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
ed20: 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
ed30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
ed40: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
ed50: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
ed60: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
ed70: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
ed80: 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
ed90: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20      pDb->zName. 
eda0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
edb0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
edc0: 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
edd0: 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
ede0: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
edf0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
ee00: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
ee10: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
ee20: 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
ee30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
ee40: 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
ee50: 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
ee60: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70  e!='trigger'", p
ee70: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
ee80: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
ee90: 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
eea0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
eeb0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
eec0: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
eed0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
eee0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
eef0: 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
ef00: 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
ef10: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
ef20: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
ef30: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
ef40: 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  0) );.    pOld =
ef50: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
ef60: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
ef70: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
efa0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
efb0: 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20 69  zName),p);.    i
efc0: 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
efd0: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
efe0: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
eff0: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
f000: 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
f010: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d  t() */.      db-
f020: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
f030: 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  1;.      return;
f040: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
f050: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
f060: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
f070: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
f080: 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65  Changes;..#ifnde
f090: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
f0a0: 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
f0b0: 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
f0c0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
f0d0: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
f0e0: 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
f0f0: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
f100: 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
f110: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
f120: 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
f130: 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
f140: 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
f150: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
f160: 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
f170: 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
f180: 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72  int)((const char
f190: 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
f1a0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ame);.      p->a
f1b0: 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
f1c0: 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
f1d0: 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
f1e0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
f1f0: 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
f200: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
f210: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
f220: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
f230: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
f240: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
f250: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
f260: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
f270: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f280: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
f290: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f2a0: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
f2b0: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
f2c0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
f2d0: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
f2e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
f2f0: 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
f300: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
f310: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
f320: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
f330: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
f340: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
f350: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
f360: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
f370: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
f380: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
f390: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
f3a0: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
f3b0: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
f3c0: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
f3d0: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
f3e0: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
f3f0: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
f400: 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
f410: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
f420: 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
f430: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
f440: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
f450: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f460: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
f470: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
f480: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
f490: 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20   0;.  int iDb;. 
f4a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
f4b0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
f4c0: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
f4d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
f4e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f4f0: 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
f500: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
f510: 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  iews");.    sqli
f520: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
f530: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
f540: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
f550: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
f560: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
f570: 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
f580: 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a  , 1, 0, noErr);.
f590: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
f5a0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
f5b0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
f5c0: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
f5d0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
f5e0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
f5f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
f600: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
f610: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
f620: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
f630: 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
f640: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f650: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
f660: 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  .  sqlite3FixIni
f670: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
f680: 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
f690: 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
f6a0: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
f6b0: 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  ix, pSelect) ){.
f6c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
f6d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
f6e0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
f6f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
f700: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
f710: 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
f720: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
f730: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
f740: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
f750: 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
f760: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
f770: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
f780: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
f790: 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
f7a0: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
f7b0: 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
f7c0: 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
f7d0: 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
f7e0: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
f7f0: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
f800: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
f810: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
f820: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
f830: 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
f840: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
f850: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
f860: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
f870: 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ect);.  if( db->
f880: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
f890: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
f8a0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
f8b0: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
f8c0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
f8d0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
f8e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
f8f0: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
f900: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
f910: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
f920: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
f930: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
f940: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
f950: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
f960: 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a  f( ALWAYS(sEnd.z
f970: 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e  [0]!=0) && sEnd.
f980: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
f990: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
f9a0: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
f9b0: 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
f9c0: 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
f9d0: 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  ->z);.  z = pBeg
f9e0: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
f9f0: 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73  ALWAYS(n>0) && s
fa00: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
fa10: 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  n-1]) ){ n--; }.
fa20: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
fa30: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
fa40: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
fa50: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
fa60: 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
fa70: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
fa80: 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
fa90: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
faa0: 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
fab0: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  0, 0);.  return;
fac0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
fad0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
fae0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
faf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
fb00: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
fb10: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
fb20: 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65  TABLE)./*.** The
fb30: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
fb40: 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
fb50: 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
fb60: 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
fb70: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
fb80: 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
fb90: 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
fba0: 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
fbb0: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
fbc0: 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
fbd0: 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
fbe0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
fbf0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
fc00: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
fc10: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
fc20: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
fc30: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
fc40: 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53  le){.  Table *pS
fc50: 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61  elTab;   /* A fa
fc60: 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  ke table from wh
fc70: 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72  ich we get the r
fc80: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53  esult set */.  S
fc90: 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
fca0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20   /* Copy of the 
fcb0: 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c  SELECT that impl
fcc0: 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20  ements the view 
fcd0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  */.  int nErr = 
fce0: 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
fcf0: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
fd00: 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ntered */.  int 
fd10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
fd20: 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c   Temporarily hol
fd30: 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ds the number of
fd40: 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65   cursors assigne
fd50: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
fd60: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
fd70: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
fd80: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c  nnection for mal
fd90: 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  loc errors */.  
fda0: 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69  int (*xAuth)(voi
fdb0: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
fdc0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  r*,const char*,c
fdd0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
fde0: 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65   char*);..  asse
fdf0: 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23  rt( pTable );..#
fe00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fe10: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
fe20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61    if( sqlite3Vta
fe30: 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61  bCallConnect(pPa
fe40: 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a  rse, pTable) ){.
fe50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fe60: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
fe70: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
fe80: 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ble) ) return 0;
fe90: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
fea0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
feb0: 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  W.  /* A positiv
fec0: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
fed0: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
fee0: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
fef0: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
ff00: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
ff10: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
ff20: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
ff30: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
ff40: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
ff50: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
ff60: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
ff70: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
ff80: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
ff90: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
ffa0: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
ffb0: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
ffc0: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
ffd0: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
ffe0: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
fff0: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
10000 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
10010 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
10020 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
10030 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
10040 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
10050 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
10060 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
10070 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65   Actually, the e
10080 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f  rror above is no
10090 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74  w caught prior t
100a0 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  o reaching this 
100b0 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20  point..  ** But 
100c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
100d0 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f  st is still impo
100e0 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73  rtant as it does
100f0 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e   come up.  ** in
10100 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
10110 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43    ** .  **     C
10120 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e  REATE TABLE main
10130 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20  .ex1(a);.  **   
10140 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49    CREATE TEMP VI
10150 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54  EW ex1 AS SELECT
10160 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a   a FROM ex1;.  *
10170 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  *     SELECT * F
10180 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20  ROM temp.ex1;.  
10190 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
101a0 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
101b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
101c0 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
101d0 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
101e0 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
101f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
10200 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 1;.  }.  asse
10210 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  rt( pTable->nCol
10220 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  >=0 );..  /* If 
10230 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
10240 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
10250 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
10260 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
10270 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
10280 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
10290 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
102a0 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
102b0 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
102c0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
102d0 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
102e0 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
102f0 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
10300 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
10310 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
10320 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
10330 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
10340 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
10350 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
10360 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
10370 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
10380 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
10390 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
103a0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
103b0 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
103c0 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
103d0 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c  Select );.  pSel
103e0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
103f0 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  Dup(db, pTable->
10400 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10410 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 75  f( pSel ){.    u
10420 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64  8 enableLookasid
10430 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  e = db->lookasid
10440 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  e.bEnabled;.    
10450 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  n = pParse->nTab
10460 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
10470 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
10480 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  s(pParse, pSel->
10490 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c  pSrc);.    pTabl
104a0 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
104b0 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
104c0 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69  bEnabled = 0;.#i
104d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
104e0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
104f0 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e      xAuth = db->
10500 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78  xAuth;.    db->x
10510 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53  Auth = 0;.    pS
10520 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
10530 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
10540 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
10550 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
10560 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20  xAuth;.#else.   
10570 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
10580 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
10590 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
105a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 62  );.#endif.    db
105b0 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
105c0 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f  bled = enableLoo
105d0 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61 72  kaside;.    pPar
105e0 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
105f0 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b    if( pSelTab ){
10600 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10610 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
10620 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
10630 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
10640 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62  nCol;.      pTab
10650 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
10660 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
10670 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
10680 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
10690 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
106a0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
106b0 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
106c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
106d0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
106e0 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
106f0 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20  Table->pSchema) 
10700 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
10710 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20  >pSchema->flags 
10720 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  |= DB_UnresetVie
10730 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ws;.    }else{. 
10740 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
10750 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72  l = 0;.      nEr
10760 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  r++;.    }.    s
10770 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
10780 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20  te(db, pSel);.  
10790 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
107a0 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  r++;.  }.#endif 
107b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
107c0 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IEW */.  return 
107d0 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
107e0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
107f0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
10800 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
10810 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10820 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  BLE) */..#ifndef
10830 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
10840 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
10850 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
10860 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
10870 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
10880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
10890 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
108a0 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
108b0 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
108c0 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74  lem *i;.  assert
108d0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
108e0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78  utexHeld(db, idx
108f0 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44  , 0) );.  if( !D
10900 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
10910 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
10920 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
10930 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
10940 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
10950 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[idx].pSchema->
10960 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71  tblHash); i;i=sq
10970 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
10980 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
10990 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
109a0 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
109b0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
109c0 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
109d0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
109e0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70  , pTab);.      p
109f0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
10a00 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
10a10 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
10a20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
10a30 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
10a40 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
10a50 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
10a60 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
10a70 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
10a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
10a90 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
10aa0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
10ab0 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
10ac0 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
10ad0 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
10ae0 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
10af0 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
10b00 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
10b10 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
10b20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
10b30 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
10b40 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
10b50 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
10b60 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
10b70 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  o..**.** Ticket 
10b80 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62  #1728:  The symb
10b90 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73  ol table might s
10ba0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66  till contain inf
10bb0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74  ormation.** on t
10bc0 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64  ables and/or ind
10bd0 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68  ices that are th
10be0 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  e process of bei
10bf0 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49  ng deleted..** I
10c00 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b  f you are unluck
10c10 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  y, one of those 
10c20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20  deleted indices 
10c30 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a  or tables might.
10c40 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ** have the same
10c50 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72   rootpage number
10c60 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62   as the real tab
10c70 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74  le or index that
10c80 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76   is.** being mov
10c90 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f  ed.  So we canno
10ca0 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67  t stop searching
10cb0 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
10cc0 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75   match .** becau
10cd0 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  se the first mat
10ce0 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20  ch might be for 
10cf0 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74  one of the delet
10d00 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72  ed indices.** or
10d10 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20   tables and not 
10d20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  the table/index 
10d30 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79  that is actually
10d40 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a   being moved..**
10d50 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75   We must continu
10d60 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  e looping until 
10d70 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
10d80 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72  ndices with.** r
10d90 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68  ootpage==iFrom h
10da0 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  ave been convert
10db0 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f  ed to have a roo
10dc0 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20  tpage of iTo.** 
10dd0 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
10de0 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67  ertain that we g
10df0 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65  ot the right one
10e00 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
10e10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
10e20 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
10e30 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71  RootPageMoved(sq
10e40 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
10e50 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
10e60 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
10e70 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
10e80 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20  sh *pHash;.  Db 
10e90 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
10ea0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
10eb0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
10ec0 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26   0) );.  pDb = &
10ed0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
10ee0 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
10ef0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a  chema->tblHash;.
10f00 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
10f10 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
10f20 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
10f30 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
10f40 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
10f50 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
10f60 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
10f70 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
10f80 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
10f90 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20       pTab->tnum 
10fa0 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
10fb0 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
10fc0 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
10fd0 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
10fe0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
10ff0 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
11000 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
11010 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
11020 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
11030 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
11040 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
11050 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
11060 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
11070 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
11080 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
11090 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74  .** Write code t
110a0 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c  o erase the tabl
110b0 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
110c0 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74   iTable from dat
110d0 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c  abase iDb..** Al
110e0 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f  so write code to
110f0 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
11100 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
11110 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
11120 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74  ema.** if a root
11130 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72  -page of another
11140 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
11150 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79  by the btree-lay
11160 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61  er whilst.** era
11170 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69  sing iTable (thi
11180 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
11190 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
111a0 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a   database)..*/ .
111b0 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
111c0 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73  royRootPage(Pars
111d0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
111e0 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
111f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
11200 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11210 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20  se);.  int r1 = 
11220 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11230 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
11240 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11250 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
11260 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
11270 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
11280 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  t(pParse);.#ifnd
11290 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
112a0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
112b0 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73  P_Destroy stores
112c0 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72   an in integer r
112d0 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  1. If this integ
112e0 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
112f0 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
11300 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
11310 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
11320 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
11330 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
11340 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
11350 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
11360 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
11370 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
11380 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
11390 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e  ** The "#NNN" in
113a0 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
113b0 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
113c0 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
113d0 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
113e0 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e   in register NNN
113f0 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72  .  See grammar r
11400 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ules associated 
11410 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49  with the TK_REGI
11420 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20  STER.  ** token 
11430 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
11440 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
11450 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
11460 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
11470 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
11480 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
11490 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
114a0 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
114b0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
114c0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
114d0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
114e0 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  ), iTable, r1, r
114f0 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
11500 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
11510 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
11520 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
11530 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
11540 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
11550 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
11560 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
11570 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
11580 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
11590 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
115a0 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
115b0 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
115c0 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
115d0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
115e0 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
115f0 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
11600 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
11610 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
11620 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
11630 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
11640 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
11650 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
11660 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
11670 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
11680 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
11690 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
116a0 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
116b0 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
116c0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
116d0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
116e0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
116f0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
11700 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
11710 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
11720 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
11730 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
11740 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
11750 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
11760 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
11770 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
11780 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
11790 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
117a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
117b0 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
117c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
117d0 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
117e0 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
117f0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
11800 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
11810 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
11820 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
11830 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
11840 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
11850 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
11860 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
11870 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
11880 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
11890 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
118a0 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
118b0 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
118c0 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
118d0 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
118e0 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
118f0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
11900 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
11910 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
11920 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
11930 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
11940 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
11950 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
11960 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
11970 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
11980 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
11990 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
119a0 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
119b0 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
119c0 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
119d0 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
119e0 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
119f0 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
11a00 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
11a10 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
11a20 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
11a30 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
11a40 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
11a50 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
11a60 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
11a70 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
11a80 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
11a90 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
11aa0 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
11ab0 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
11ac0 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
11ad0 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
11ae0 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
11af0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
11b00 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
11b10 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
11b20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
11b30 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
11b40 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
11b50 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
11b60 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
11b70 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
11b80 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
11b90 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
11ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
11bb0 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
11bc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
11bd0 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
11be0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
11bf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c00 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
11c10 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
11c20 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
11c30 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
11c40 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
11c50 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
11c60 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20  db->nDb );.     
11c70 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
11c80 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
11c90 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
11ca0 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
11cb0 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
11cc0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
11cd0 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  Remove entries f
11ce0 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
11cf0 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72  tatN tables (for
11d00 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a   N in (1,2,3)).*
11d10 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49  * after a DROP I
11d20 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42  NDEX or DROP TAB
11d30 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  LE command..*/.s
11d40 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
11d50 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
11d60 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
11d70 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
11d80 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
11d90 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11db0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e  * The database n
11dc0 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  umber */.  const
11dd0 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20   char *zType,   
11de0 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74    /* "idx" or "t
11df0 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  bl" */.  const c
11e00 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
11e10 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78  /* Name of index
11e20 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a   or table */.){.
11e30 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
11e40 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
11e50 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
11e60 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66  [iDb].zName;.  f
11e70 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b  or(i=1; i<=4; i+
11e80 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61  +){.    char zTa
11e90 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74  b[24];.    sqlit
11ea0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
11eb0 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73  of(zTab),zTab,"s
11ec0 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29  qlite_stat%d",i)
11ed0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
11ee0 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
11ef0 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62  e->db, zTab, zDb
11f00 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
11f10 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
11f20 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
11f30 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
11f40 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51  Q.%s WHERE %s=%Q
11f50 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61  ",.        zDbNa
11f60 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c  me, zTab, zType,
11f70 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a   zName.      );.
11f80 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11f90 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
11fa0 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
11fb0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11fc0 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50  3CodeDropTable(P
11fd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
11fe0 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69  ble *pTab, int i
11ff0 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  Db, int isView){
12000 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
12010 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12020 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65  se->db;.  Trigge
12030 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44  r *pTrigger;.  D
12040 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
12050 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73  b[iDb];..  v = s
12060 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12070 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
12080 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
12090 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
120a0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
120b0 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
120c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
120d0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
120e0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
120f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12100 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
12110 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  egin);.  }.#endi
12120 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
12130 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
12140 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
12150 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
12160 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20  d. Code.  ** is 
12170 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
12180 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
12190 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
121a0 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74  nd/or.  ** sqlit
121b0 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
121c0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
121d0 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
121e0 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
121f0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
12200 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
12210 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12220 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
12230 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
12240 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72   || .        pTr
12250 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
12260 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
12270 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
12280 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
12290 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
122a0 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  );.    pTrigger 
122b0 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
122c0 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
122d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
122e0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  INCREMENT.  /* R
122f0 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
12300 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
12310 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
12320 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
12330 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
12340 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
12350 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
12360 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
12370 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68  opped.  ** at th
12380 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
12390 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
123a0 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
123b0 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d   needs to.  ** m
123c0 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
123d0 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
123e0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
123f0 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
12400 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  */.  if( pTab->t
12410 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
12420 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
12430 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
12440 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
12450 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
12460 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
12470 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
12480 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
12490 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
124a0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
124b0 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
124c0 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
124d0 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
124e0 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
124f0 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
12500 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
12510 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
12520 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
12530 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
12540 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
12550 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
12560 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
12570 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
12580 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
12590 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
125a0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
125b0 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
125c0 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
125d0 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
125e0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
125f0 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
12600 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
12610 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
12620 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
12630 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
12640 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
12650 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
12660 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
12670 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
12680 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
12690 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
126a0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
126b0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
126c0 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
126d0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
126e0 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
126f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
12700 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
12710 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
12720 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
12730 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
12740 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  nd modify.  ** t
12750 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
12760 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
12770 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
12780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12790 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
127a0 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
127b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
127c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
127d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
127e0 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
127f0 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
12800 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
12810 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
12820 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
12830 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
12840 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
12850 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12860 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
12870 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
12880 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
12890 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
128a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
128b0 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
128c0 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
128d0 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
128e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
128f0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
12900 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
12910 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
12920 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
12930 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12940 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
12950 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
12960 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
12970 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
12980 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
12990 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
129a0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
129b0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
129c0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f  c==1 );.  if( no
129d0 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
129e0 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20  ssErr++;.  pTab 
129f0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
12a00 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
12a10 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
12a20 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
12a30 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
12a40 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
12a50 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
12a60 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
12a70 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
12a80 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
12a90 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
12aa0 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
12ab0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
12ac0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
12ad0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
12ae0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
12af0 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
12b00 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
12b10 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
12b20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
12b30 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
12b40 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
12b50 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
12b60 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
12b70 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
12b80 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
12b90 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
12ba0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
12bb0 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
12bc0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
12bd0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
12be0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12bf0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
12c00 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
12c10 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
12c20 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
12c30 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
12c40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
12c50 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
12c60 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
12c70 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
12c80 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
12c90 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
12ca0 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
12cb0 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
12cc0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
12cd0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
12ce0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
12cf0 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
12d00 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
12d10 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
12d20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
12d30 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
12d40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12d50 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
12d60 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
12d70 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
12d80 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12d90 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
12da0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
12db0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
12dc0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
12dd0 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
12de0 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
12df0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
12e00 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
12e10 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
12e20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
12e30 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
12e40 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
12e50 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
12e60 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
12e70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12e80 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
12e90 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
12ea0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
12eb0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
12ec0 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
12ed0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
12ee0 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
12ef0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
12f00 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
12f10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
12f20 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
12f30 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
12f40 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
12f50 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
12f60 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
12f70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
12f80 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
12f90 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
12fa0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
12fb0 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
12fc0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
12fd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
12fe0 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
12ff0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13000 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13010 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
13020 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
13030 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13040 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13050 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
13060 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13070 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
13080 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
13090 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
130a0 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
130b0 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
130c0 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
130d0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
130e0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
130f0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
13100 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13110 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
13120 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
13130 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
13140 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
13150 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13160 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
13170 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
13180 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
13190 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
131a0 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
131b0 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
131c0 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
131d0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
131e0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
131f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13200 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
13210 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
13220 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
13230 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
13240 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
13250 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13260 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
13270 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
13280 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
13290 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
132a0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
132b0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
132c0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
132d0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
132e0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
132f0 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
13300 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
13310 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
13320 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
13330 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
13340 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
13350 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
13360 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
13370 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
13380 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13390 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
133a0 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
133b0 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
133c0 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
133d0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
133e0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
133f0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
13400 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
13410 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
13420 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
13430 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
13440 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
13450 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
13460 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
13470 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
13480 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
13490 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
134a0 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70   referred to.  p
134b0 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20  ToCol is a list 
134c0 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
134d0 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61   other.** pTo ta
134e0 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72  ble that the for
134f0 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20  eign key points 
13500 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  to.  flags conta
13510 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
13520 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
13530 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
13540 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
13550 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
13560 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
13570 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
13580 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
13590 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
135a0 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
135b0 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
135c0 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
135d0 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
135e0 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
135f0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
13600 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  le field..**.** 
13610 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
13620 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
13630 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
13640 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
13650 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
13660 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
13670 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
13680 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
13690 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
136a0 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
136b0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
136c0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
136d0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
136e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
136f0 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
13700 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
13710 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
13720 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
13730 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
13740 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
13750 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
13760 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
13770 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
13780 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
13790 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
137a0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
137b0 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
137c0 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
137d0 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ms. */.){.  sqli
137e0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
137f0 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  ->db;.#ifndef SQ
13800 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
13810 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
13820 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20  Key = 0;.  FKey 
13830 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c  *pNextTo;.  Tabl
13840 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
13850 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
13860 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
13870 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
13880 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74  ar *z;..  assert
13890 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
138a0 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  ( p==0 || IN_DEC
138b0 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
138c0 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
138d0 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
138e0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
138f0 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
13900 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20  NEVER(iCol<0) ) 
13910 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
13920 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
13930 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
13940 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13950 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13960 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
13970 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
13980 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
13990 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
139a0 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
139b0 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
139c0 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
139d0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
139e0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
139f0 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
13a00 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
13a10 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
13a20 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
13a30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13a40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
13a50 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
13a60 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
13a70 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
13a80 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
13a90 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
13aa0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
13ab0 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
13ac0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
13ad0 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
13ae0 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
13af0 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
13b00 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
13b10 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  FKey) + (nCol-1)
13b20 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
13b30 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
13b40 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
13b50 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
13b60 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78  0; i<pToCol->nEx
13b70 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
13b80 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
13b90 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d  Strlen30(pToCol-
13ba0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31  >a[i].zName) + 1
13bb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
13bc0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Key = sqlite3DbM
13bd0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
13be0 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
13bf0 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  ey==0 ){.    got
13c00 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
13c10 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
13c20 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
13c30 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
13c40 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
13c50 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d  FKey->aCol[nCol]
13c60 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d  ;.  pFKey->zTo =
13c70 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20   z;.  memcpy(z, 
13c80 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b  pTo->z, pTo->n);
13c90 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30  .  z[pTo->n] = 0
13ca0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  ;.  sqlite3Dequo
13cb0 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54  te(z);.  z += pT
13cc0 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d  o->n+1;.  pFKey-
13cd0 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
13ce0 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
13cf0 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
13d00 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
13d10 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
13d20 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
13d30 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
13d40 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
13d50 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
13d60 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
13d70 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
13d80 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
13d90 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
13da0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
13db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
13dc0 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
13dd0 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
13de0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13df0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13e00 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
13e10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13e20 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13e30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
13e40 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
13e50 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
13e60 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
13e70 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
13e80 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
13e90 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
13ea0 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
13eb0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
13ec0 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
13ed0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
13ee0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
13ef0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
13f00 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
13f10 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
13f20 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
13f30 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
13f40 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
13f50 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
13f60 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
13f70 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
13f80 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
13f90 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
13fa0 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
13fb0 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67  n[0] = (u8)(flag
13fc0 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20  s & 0xff);      
13fd0 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45        /* ON DELE
13fe0 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70  TE action */.  p
13ff0 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d  FKey->aAction[1]
14000 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e   = (u8)((flags >
14010 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20  > 8 ) & 0xff);  
14020 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61    /* ON UPDATE a
14030 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ction */..  asse
14040 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
14050 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
14060 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  , p->pSchema) );
14070 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b  .  pNextTo = (FK
14080 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ey *)sqlite3Hash
14090 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
140a0 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20  ma->fkeyHash, . 
140b0 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
140c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
140d0 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28 76  (pFKey->zTo), (v
140e0 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
140f0 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
14100 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64 62 2d  pFKey ){.    db-
14110 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
14120 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  1;.    goto fk_e
14130 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  nd;.  }.  if( pN
14140 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73  extTo ){.    ass
14150 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50  ert( pNextTo->pP
14160 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  revTo==0 );.    
14170 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
14180 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e   pNextTo;.    pN
14190 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d  extTo->pPrevTo =
141a0 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f   pFKey;.  }..  /
141b0 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
141c0 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
141d0 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
141e0 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
141f0 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
14200 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
14210 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  end:.  sqlite3Db
14220 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b  Free(db, pFKey);
14230 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
14240 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14250 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
14260 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
14270 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f  tDelete(db, pFro
14280 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
14290 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
142a0 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  b, pToCol);.}../
142b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
142c0 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
142d0 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
142e0 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
142f0 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
14300 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
14310 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
14320 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
14330 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
14340 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
14350 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
14360 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
14370 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
14380 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
14390 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
143a0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
143b0 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
143c0 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
143d0 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
143e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
143f0 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
14400 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14410 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
14420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14430 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
14440 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
14450 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
14460 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
14470 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
14480 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
14490 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
144a0 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
144b0 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30  t( isDeferred==0
144c0 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d   || isDeferred==
144d0 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  1 ); /* EV: R-30
144e0 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70  323-21917 */.  p
144f0 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
14500 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65   = (u8)isDeferre
14510 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
14520 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
14530 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
14540 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
14550 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
14560 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
14570 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
14580 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
14590 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
145a0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
145b0 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
145c0 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
145d0 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
145e0 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
145f0 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
14600 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
14610 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
14620 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
14630 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63  he register spec
14640 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
14650 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
14660 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
14670 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
14680 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
14690 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
146a0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
146b0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
146c0 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
146d0 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
146e0 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
146f0 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
14700 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
14710 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
14720 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
14730 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14740 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
14750 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
14760 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
14770 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
14780 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
14790 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
147a0 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
147b0 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
147c0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
147d0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
147e0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
147f0 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
14800 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
14810 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14820 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
14830 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
14840 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
14850 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20  iSorter;        
14860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
14870 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f  rsor opened by O
14880 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e  penSorter (if in
14890 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61   use) */.  int a
148a0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
148b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
148c0 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
148d0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
148e0 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
148f0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
14900 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f  ss to jump to fo
14910 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  r next iteration
14920 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
14950 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
14960 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65  int iPartIdxLabe
14970 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
14980 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c  * Jump to this l
14990 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72  abel to skip a r
149a0 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ow */.  Vdbe *v;
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149c0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
149d0 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
149e0 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
149f0 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
14a00 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
14a10 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
14a20 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
14a30 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14a50 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
14a60 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69 6e  ng assemblied in
14a70 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
14a80 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14a90 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f  arse->db;      /
14aa0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
14ab0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
14ac0 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
14ad0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
14ae0 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
14af0 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
14b00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
14b10 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c  ZATION.  if( sql
14b20 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
14b30 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49  arse, SQLITE_REI
14b40 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NDEX, pIndex->zN
14b50 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62  ame, 0,.      db
14b60 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
14b70 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   ) ){.    return
14b80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14b90 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69  /* Require a wri
14ba0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74  te-lock on the t
14bb0 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20  able to perform 
14bc0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a  this operation *
14bd0 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  /.  sqlite3Table
14be0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
14bf0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c  , pTab->tnum, 1,
14c00 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
14c10 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
14c20 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
14c30 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
14c40 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  n;.  if( memRoot
14c50 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74  Page>=0 ){.    t
14c60 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67  num = memRootPag
14c70 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
14c80 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
14c90 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20  num;.  }.  pKey 
14ca0 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
14cb0 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
14cc0 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  ndex);..  /* Ope
14cd0 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72  n the sorter cur
14ce0 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f  sor if we are to
14cf0 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69   use one. */.  i
14d00 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d  Sorter = pParse-
14d10 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
14d20 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14d30 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69  OP_SorterOpen, i
14d40 53 6f 72 74 65 72 2c 20 30 2c 20 30 2c 20 28 63  Sorter, 0, 0, (c
14d50 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  har*)pKey, P4_KE
14d60 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70  YINFO);..  /* Op
14d70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f  en the table. Lo
14d80 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72  op through all r
14d90 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
14da0 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65  , inserting inde
14db0 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69  x.  ** records i
14dc0 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20  nto the sorter. 
14dd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  */.  sqlite3Open
14de0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
14df0 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
14e00 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61  P_OpenRead);.  a
14e10 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
14e20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
14e30 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
14e40 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  .  regRecord = s
14e50 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
14e60 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c  (pParse);..  sql
14e70 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
14e80 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 6e  xKey(pParse, pIn
14e90 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52 65  dex, iTab, regRe
14ea0 63 6f 72 64 2c 20 30 2c 20 26 69 50 61 72 74 49  cord, 0, &iPartI
14eb0 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  dxLabel);.  sqli
14ec0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14ed0 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
14ee0 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65  , iSorter, regRe
14ef0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
14f00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
14f10 28 76 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65  (v, iPartIdxLabe
14f20 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
14f30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
14f40 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b  xt, iTab, addr1+
14f50 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
14f60 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
14f70 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  r1);.  if( memRo
14f80 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74  otPage<0 ) sqlit
14f90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14fa0 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
14fb0 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
14fc0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
14fd0 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
14fe0 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
15010 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
15020 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  F);.  sqlite3Vdb
15030 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
15040 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65  LAG_BULKCSR|((me
15050 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50  mRootPage>=0)?OP
15060 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29  FLAG_P2ISREG:0))
15070 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  ;..  addr1 = sql
15080 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15090 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
150a0 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 0a 20 20   iSorter, 0);.  
150b0 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
150c0 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
150d0 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c      int j2 = sql
150e0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
150f0 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20 20  ddr(v) + 3;.    
15100 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15110 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
15120 20 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20   j2);.    addr2 
15130 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
15140 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
15150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15160 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43  p3(v, OP_SorterC
15170 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c  ompare, iSorter,
15180 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b   j2, regRecord);
15190 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74  .    sqlite3Halt
151a0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
151b0 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  e, SQLITE_CONSTR
151c0 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20  AINT_UNIQUE,.   
151d0 20 20 20 20 20 4f 45 5f 41 62 6f 72 74 2c 20 22       OE_Abort, "
151e0 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
151f0 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
15200 20 50 34 5f 53 54 41 54 49 43 0a 20 20 20 20 29   P4_STATIC.    )
15210 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
15220 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
15230 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15240 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
15250 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15260 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72  SorterData, iSor
15270 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
15280 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15290 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp3(v, OP_IdxIn
152a0 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52  sert, iIdx, regR
152b0 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c  ecord, 1);.  sql
152c0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
152d0 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
152e0 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
152f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15300 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
15310 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
15320 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15330 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f  _SorterNext, iSo
15340 72 74 65 72 2c 20 61 64 64 72 32 29 3b 0a 20 20  rter, addr2);.  
15350 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
15360 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
15370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15380 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
15390 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65   iTab);.  sqlite
153a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
153b0 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a  P_Close, iIdx);.
153c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
153d0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
153e0 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a   iSorter);.}../*
153f0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65 61  .** Allocate hea
15400 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  p space to hold 
15410 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  an Index object 
15420 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e  with nCol column
15430 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  s..**.** Increas
15440 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
15450 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64 65   size to provide
15460 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72 61   an extra nExtra
15470 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62   bytes.** of 8-b
15480 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61 63  yte aligned spac
15490 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
154a0 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  x object and ret
154b0 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72  urn a.** pointer
154c0 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20 73   to this extra s
154d0 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72 61  pace in *ppExtra
154e0 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
154f0 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
15500 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74 65  Object(.  sqlite
15510 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
15520 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
15530 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e  ction */.  i16 n
15540 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
15550 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
15560 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
15570 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
15580 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
15590 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
155a0 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73 70  ytes of extra sp
155b0 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a  ace to alloc */.
155c0 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72 61    char **ppExtra
155d0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
155e0 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61 22  r to the "extra"
155f0 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49   space */.){.  I
15600 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20  ndex *p;        
15610 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
15620 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
15630 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
15640 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
15650 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49 6e   of space for In
15660 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72 72  dex object + arr
15670 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20  ays */..  nByte 
15680 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
15690 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20  Index)) +       
156a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
156b0 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
156c0 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73          ROUND8(s
156d0 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f  izeof(char*)*nCo
156e0 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  l) +         /* 
156f0 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
15700 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f   */.          RO
15710 55 4e 44 38 28 73 69 7a 65 6f 66 28 74 52 6f 77  UND8(sizeof(tRow
15720 63 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  cnt)*(nCol+1) + 
15730 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
15740 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  wEst   */.      
15750 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
15760 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20  f(i16)*nCol +   
15770 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15780 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c   sizeof(u8)*nCol
157b0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
157c0 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
157d0 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  er */.  p = sqli
157e0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
157f0 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74  db, nByte + nExt
15800 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ra);.  if( p ){.
15810 20 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61      char *pExtra
15820 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f   = ((char*)p)+RO
15830 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
15840 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f  x));.    p->azCo
15850 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 70 45 78  ll = (char**)pEx
15860 74 72 61 3b 20 20 20 20 20 20 70 45 78 74 72 61  tra;      pExtra
15870 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
15880 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a  f(char*)*nCol);.
15890 20 20 20 20 70 2d 3e 61 69 52 6f 77 45 73 74 20      p->aiRowEst 
158a0 3d 20 28 74 52 6f 77 63 6e 74 2a 29 70 45 78 74  = (tRowcnt*)pExt
158b0 72 61 3b 20 20 70 45 78 74 72 61 20 2b 3d 20 73  ra;  pExtra += s
158c0 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 28  izeof(tRowcnt)*(
158d0 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e  nCol+1);.    p->
158e0 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
158f0 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 70 45  )pExtra;      pE
15900 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69  xtra += sizeof(i
15910 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  16)*nCol;.    p-
15920 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
15930 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70  8*)pExtra;.    p
15940 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c  ->nColumn = nCol
15950 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c  ;.    p->nKeyCol
15960 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20   = nCol - 1;.   
15970 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63 68   *ppExtra = ((ch
15980 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a  ar*)p) + nByte;.
15990 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
159a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
159b0 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
159c0 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
159d0 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20  Name1.pName2 is 
159e0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
159f0 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54  index .** and pT
15a00 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61  blList is the na
15a10 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
15a20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
15a30 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
15a40 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
15a50 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
15a60 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
15a70 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
15a80 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
15a90 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
15aa0 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
15ab0 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
15ac0 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
15ad0 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
15ae0 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
15af0 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
15b00 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
15b10 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
15b20 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
15b30 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
15b40 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
15b50 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
15b60 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
15b70 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
15b80 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
15b90 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
15ba0 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
15bb0 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
15bc0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
15bd0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
15be0 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
15bf0 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
15c00 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
15c10 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  ruction.  .**.**
15c20 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   If the index is
15c30 20 63 72 65 61 74 65 64 20 73 75 63 63 65 73 73   created success
15c40 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61 20  fully, return a 
15c50 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
15c60 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75  ew Index.** stru
15c70 63 74 75 72 65 2e 20 54 68 69 73 20 69 73 20 75  cture. This is u
15c80 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 41 64  sed by sqlite3Ad
15c90 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20 74 6f  dPrimaryKey() to
15ca0 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65 78 0a   mark the index.
15cb0 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 73  ** as the tables
15cc0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 49 6e   primary key (In
15cd0 64 65 78 2e 61 75 74 6f 49 6e 64 65 78 3d 3d 32  dex.autoIndex==2
15ce0 29 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  )..*/.Index *sql
15cf0 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
15d00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15d10 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  ,     /* All inf
15d20 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
15d30 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
15d40 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
15d50 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
15d60 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
15d70 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
15d80 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
15d90 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
15da0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
15db0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
15dc0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e    SrcList *pTblN
15dd0 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f  ame, /* Table to
15de0 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72   index. Use pPar
15df0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
15e00 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74   0 */.  ExprList
15e10 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
15e20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
15e30 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
15e40 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
15e50 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72        /* OE_Abor
15e60 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
15e70 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
15e80 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
15e90 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
15ea0 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
15eb0 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69   that begins thi
15ec0 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
15ed0 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c   Expr *pPIWhere,
15ee0 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
15ef0 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20  use for partial 
15f00 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
15f10 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20   sortOrder,     
15f20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66  /* Sort order of
15f30 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65   primary key whe
15f40 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f  n pList==NULL */
15f50 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73  .  int ifNotExis
15f60 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72  t     /* Omit er
15f70 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72  ror if index alr
15f80 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
15f90 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74 20  {.  Index *pRet 
15fa0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  = 0;     /* Poin
15fb0 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ter to return */
15fc0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
15fd0 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65   0;     /* Table
15fe0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
15ff0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
16000 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
16010 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
16020 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
16030 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Name = 0;     /*
16040 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
16050 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ex */.  int nNam
16060 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
16070 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
16080 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
16090 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44  .  int i, j;.  D
160a0 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
160b0 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
160c0 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
160d0 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
160e0 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
160f0 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
16100 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
16110 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
16120 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
16130 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
16140 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
16150 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16160 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
16170 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
16180 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
16190 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
161a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
161b0 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
161c0 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
161d0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
161e0 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
161f0 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
16200 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
16210 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
16220 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
16230 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
16240 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
16250 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
16260 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
16270 70 54 61 62 43 6f 6c 3b 20 20 20 20 20 20 20 20  pTabCol;        
16280 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 69     /* A column i
16290 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
162a0 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
162d0 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b  ated for zExtra[
162e0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  ] */.  int nExtr
162f0 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  aCol;           
16300 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16310 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d  r of extra colum
16320 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63  ns needed */.  c
16330 68 61 72 20 2a 7a 45 78 74 72 61 3b 20 20 20 20  har *zExtra;    
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61  /* Extra space a
16360 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
16370 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78  bject */.  Index
16380 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20   *pPk = 0;      
16390 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  /* PRIMARY KEY i
163a0 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
163b0 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
163c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
163d0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
163e0 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c      /* Never cal
163f0 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
16400 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
16410 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16420 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
16430 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  AB ){.    goto e
16440 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
16450 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
16460 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
16470 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
16480 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
16490 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
164a0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
164b0 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
164c0 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
164d0 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
164e0 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
164f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
16500 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
16510 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
16520 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
16530 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
16540 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
16550 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
16560 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
16570 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
16580 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
16590 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
165a0 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
165b0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
165c0 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
165d0 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
165e0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
165f0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
16600 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
16610 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
16620 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
16630 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
16640 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20  ssert( pName && 
16650 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66  pName->z );..#if
16660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16670 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49  _TEMPDB.    /* I
16680 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
16690 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
166a0 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
166b0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
166c0 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
166d0 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
166e0 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f  base to 1. Do no
166f0 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  t do this.    **
16700 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67   if initialising
16710 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
16720 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ma..    */.    i
16730 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
16740 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  y ){.      pTab 
16750 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
16760 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
16770 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TblName);.      
16780 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30  if( pName2->n==0
16790 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
167a0 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
167b0 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
167c0 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31  .        iDb = 1
167d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
167e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69  #endif..    sqli
167f0 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
16800 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
16810 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a  index", pName);.
16820 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
16830 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
16840 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20   pTblName) ){.  
16850 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74      /* Because t
16860 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72  he parser constr
16870 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72  ucts pTblName fr
16880 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e  om a single iden
16890 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a  tifier,.      **
168a0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
168b0 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69  st can never fai
168c0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  l. */.      asse
168d0 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rt(0);.    }.   
168e0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
168f0 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
16900 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e  Parse, 0, &pTblN
16910 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20  ame->a[0]);.    
16920 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
16930 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70  ocFailed==0 || p
16940 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab==0 );.    if
16950 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
16960 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
16970 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d  ex;.    if( iDb=
16980 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44  =1 && db->aDb[iD
16990 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62  b].pSchema!=pTab
169a0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
169b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
169c0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
169d0 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
169e0 72 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64  reate a TEMP ind
169f0 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74  ex on non-TEMP t
16a00 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20  able \"%s\"",.  
16a10 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
16a20 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
16a30 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
16a40 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
16a50 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
16a60 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74  b) ) pPk = sqlit
16a70 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
16a80 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  x(pTab);.  }else
16a90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
16aa0 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ame==0 );.    as
16ab0 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20  sert( pStart==0 
16ac0 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
16ad0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
16ae0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
16af0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
16b00 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
16b10 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
16b20 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
16b30 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
16b40 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
16b50 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74  [iDb];..  assert
16b60 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
16b70 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
16b80 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
16b90 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
16ba0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
16bb0 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20  lite_", 7)==0 . 
16bc0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
16bd0 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e  StrNICmp(&pTab->
16be0 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74  zName[7],"altert
16bf0 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20  ab_",9)!=0 ){.  
16c00 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16c10 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
16c20 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
16c30 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
16c40 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
16c50 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
16c60 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
16c70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
16c80 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
16c90 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
16ca0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16cb0 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
16cc0 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
16cd0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
16ce0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
16cf0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
16d00 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
16d10 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
16d20 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
16d30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16d40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
16d50 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79  rtual tables may
16d60 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
16d70 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
16d80 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
16d90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
16da0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
16db0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
16dc0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
16dd0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
16de0 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
16df0 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
16e00 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
16e10 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
16e20 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
16e30 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
16e40 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
16e50 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
16e60 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
16e70 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
16e80 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
16e90 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
16ea0 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
16eb0 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
16ec0 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
16ed0 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
16ee0 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
16ef0 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
16f00 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
16f10 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
16f20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
16f30 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
16f40 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
16f50 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
16f60 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
16f70 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
16f80 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
16f90 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
16fa0 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
16fb0 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
16fc0 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
16fd0 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
16fe0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
16ff0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  db, pName);.    
17000 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
17010 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17020 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
17030 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29  t( pName->z!=0 )
17040 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
17050 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
17060 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
17070 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
17080 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
17090 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
170a0 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
170b0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
170c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
170d0 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
170e0 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
170f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17100 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
17110 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
17120 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
17130 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
17140 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17150 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
17160 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
17170 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
17180 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
17190 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
171a0 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73    if( !ifNotExis
171b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
171c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
171d0 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
171e0 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
171f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  zName);.      }e
17200 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
17210 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
17220 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73  usy );.        s
17230 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
17240 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
17250 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
17260 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17270 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
17280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
17290 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
172a0 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
172b0 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
172c0 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
172d0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
172e0 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e  t, n++){}.    zN
172f0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
17300 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
17310 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64  _autoindex_%s_%d
17320 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
17330 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  n);.    if( zNam
17340 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  e==0 ){.      go
17350 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17360 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
17370 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
17380 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
17390 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
173a0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
173b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
173c0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
173d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
173e0 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20   = pDb->zName;. 
173f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
17400 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
17410 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
17420 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
17430 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
17440 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17450 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
17460 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
17470 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
17480 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
17490 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69  DB && iDb==1 ) i
174a0 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
174b0 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
174c0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
174d0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
174e0 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
174f0 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
17500 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17510 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
17520 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17530 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
17540 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
17550 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
17560 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
17570 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
17580 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
17590 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
175a0 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
175b0 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
175c0 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
175d0 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
175e0 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
175f0 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
17600 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
17610 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
17620 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Parse, 0, 0);.  
17630 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
17640 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17650 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69  e_index;.    pLi
17660 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  st->a[0].zName =
17670 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
17680 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176b0 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
176c0 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
176d0 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d  ame);.    pList-
176e0 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
176f0 3d 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b  = (u8)sortOrder;
17700 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
17710 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62  e out how many b
17720 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72  ytes of space ar
17730 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  e required to st
17740 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20  ore explicitly. 
17750 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f   ** specified co
17760 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
17770 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66   names..  */.  f
17780 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
17790 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
177a0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
177b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
177c0 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
177d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
177e0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
177f0 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20  COLLATE );.     
17800 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
17810 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
17820 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
17830 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
17840 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
17850 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
17860 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
17870 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
17880 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
17890 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b   nExtraCol = pPk
178a0 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20   ? pPk->nKeyCol 
178b0 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  : 1;.  pIndex = 
178c0 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
178d0 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
178e0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45  List->nExpr + nE
178f0 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  xtraCol,.       
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
17920 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20  Name + nExtra + 
17930 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69  1, &zExtra);.  i
17940 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
17950 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
17960 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17970 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
17980 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
17990 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69  NMENT(pIndex->ai
179a0 52 6f 77 45 73 74 29 20 29 3b 0a 20 20 61 73 73  RowEst) );.  ass
179b0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
179c0 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78  ALIGNMENT(pIndex
179d0 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70  ->azColl) );.  p
179e0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Index->zName = z
179f0 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
17a00 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20  += nName + 1;.  
17a10 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  memcpy(pIndex->z
17a20 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
17a30 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d  me+1);.  pIndex-
17a40 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
17a50 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f    pIndex->onErro
17a60 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  r = (u8)onError;
17a70 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e  .  pIndex->uniqN
17a80 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
17a90 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e  !=OE_None;.  pIn
17aa0 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d  dex->autoIndex =
17ab0 20 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b   (u8)(pName==0);
17ac0 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
17ad0 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
17ae0 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e  ].pSchema;.  pIn
17af0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70  dex->nKeyCol = p
17b00 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
17b10 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20  f( pPIWhere ){. 
17b20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
17b30 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
17b40 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
17b50 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72  PartIdx, pPIWher
17b60 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65  e, 0);.    pInde
17b70 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
17b80 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20   = pPIWhere;.   
17b90 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20   pPIWhere = 0;. 
17ba0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
17bb0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
17bc0 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
17bd0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
17be0 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
17bf0 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
17c00 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
17c10 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
17c20 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
17c30 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
17c40 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
17c50 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
17c60 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
17c70 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
17c80 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
17c90 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
17ca0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61  */.  }..  /* Sca
17cb0 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
17cc0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
17cd0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
17ce0 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
17cf0 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
17d00 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
17d10 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
17d20 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
17d30 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
17d40 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
17d50 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  d..  **.  ** TOD
17d60 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74  O:  Add a test t
17d70 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
17d80 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
17d90 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20   is not named.  
17da0 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
17db0 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  e within the sam
17dc0 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  e index.  Only t
17dd0 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
17de0 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e of.  ** the co
17df0 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62  lumn will ever b
17e00 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70  e used by the op
17e10 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74  timizer.  Note t
17e20 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hat using the.  
17e30 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d  ** same column m
17e40 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61  ore than once ca
17e50 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72  nnot be an error
17e60 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
17e70 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20  uld .  ** break 
17e80 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
17e90 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65  ibility - it nee
17ea0 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69  ds to be a warni
17eb0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ng..  */.  for(i
17ec0 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
17ed0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
17ee0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
17ef0 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
17f00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
17f10 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
17f20 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  >zName;.    int 
17f30 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
17f40 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  er;.    char *zC
17f50 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
17f60 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
17f70 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
17f80 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  e */..    for(j=
17f90 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  0, pTabCol=pTab-
17fa0 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
17fb0 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f  Col; j++, pTabCo
17fc0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
17fd0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
17fe0 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c  ColName, pTabCol
17ff0 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
18000 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
18010 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
18020 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18030 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18040 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
18050 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
18060 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
18070 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61  b->zName, zColNa
18080 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  me);.      pPars
18090 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
180a0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
180b0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
180c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
180d0 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 3d  rt( pTab->nCol<=
180e0 30 78 37 66 66 66 20 26 26 20 6a 3c 3d 30 78 37  0x7fff && j<=0x7
180f0 66 66 66 20 29 3b 0a 20 20 20 20 70 49 6e 64 65  fff );.    pInde
18100 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
18110 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 69 66 28   (i16)j;.    if(
18120 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
18130 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
18140 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  Coll;.      asse
18150 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  rt( pListItem->p
18160 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
18170 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 7a 43  LATE );.      zC
18180 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  oll = pListItem-
18190 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pExpr->u.zToken
181a0 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20  ;.      nColl = 
181b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
181c0 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20  zColl) + 1;.    
181d0 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
181e0 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  >=nColl );.     
181f0 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
18200 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20  zColl, nColl);. 
18210 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78       zColl = zEx
18220 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72  tra;.      zExtr
18230 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a += nColl;.    
18240 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c    nExtra -= nCol
18250 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
18260 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
18270 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
18280 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  .      if( !zCol
18290 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 49 4e  l ) zColl = "BIN
182a0 41 52 59 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ARY";.    }.    
182b0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
182c0 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f  sy && !sqlite3Lo
182d0 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
182e0 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, zColl) ){.  
182f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18300 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18310 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  }.    pIndex->az
18320 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b  Coll[i] = zColl;
18330 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f  .    requestedSo
18340 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49  rtOrder = pListI
18350 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26  tem->sortOrder &
18360 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a   sortOrderMask;.
18370 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
18380 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29  tOrder[i] = (u8)
18390 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
183a0 65 72 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  er;.    if( pTab
183b0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c  ->aCol[j].notNul
183c0 6c 3d 3d 30 20 29 20 70 49 6e 64 65 78 2d 3e 75  l==0 ) pIndex->u
183d0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
183e0 20 20 7d 0a 20 20 69 66 28 20 70 50 6b 20 29 7b    }.  if( pPk ){
183f0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
18400 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  pPk->nKeyCol; j+
18410 2b 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  +, i++){.      p
18420 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
18430 69 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  i] = pPk->aiColu
18440 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 49 6e  mn[j];.      pIn
18450 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
18460 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b   pPk->azColl[j];
18470 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  .      pIndex->a
18480 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
18490 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  Pk->aSortOrder[j
184a0 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
184b0 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  {.    pIndex->ai
184c0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 2d 31 3b 0a  Column[i] = -1;.
184d0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
184e0 6c 6c 5b 69 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[i] = "BINARY"
184f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
18500 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
18510 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72  dex);.  if( pPar
18520 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
18530 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78   ) estimateIndex
18540 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a  Width(pIndex);..
18550 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
18560 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
18570 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
18580 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
18590 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
185a0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
185b0 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
185c0 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
185d0 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
185e0 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
185f0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
18600 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
18610 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
18620 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
18630 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
18640 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
18650 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
18660 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
18670 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
18680 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
18690 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
186a0 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
186b0 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
186c0 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
186d0 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
186e0 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
186f0 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
18700 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
18710 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
18720 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
18730 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
18740 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
18750 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
18760 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
18770 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
18780 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
18790 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
187a0 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
187b0 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
187c0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
187d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
187e0 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
187f0 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
18800 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
18810 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
18820 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
18830 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
18840 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
18850 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
18860 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
18870 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
18880 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
18890 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
188a0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
188b0 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
188c0 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
188d0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
188e0 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
188f0 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
18900 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
18910 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
18920 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
18930 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
18940 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
18950 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
18960 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
18970 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
18980 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
18990 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  t( pIdx->onError
189a0 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  !=OE_None );.   
189b0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
189c0 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20  >autoIndex );.  
189d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
189e0 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
189f0 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  None );..      i
18a00 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  f( pIdx->nKeyCol
18a10 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  !=pIndex->nKeyCo
18a20 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
18a30 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
18a40 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b  Idx->nKeyCol; k+
18a50 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
18a60 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20  t char *z1;.    
18a70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
18a80 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z2;.        if( 
18a90 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
18aa0 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
18ab0 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
18ac0 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
18ad0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
18ae0 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
18af0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
18b00 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32        if( z1!=z2
18b10 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
18b20 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
18b30 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
18b40 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
18b50 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
18b60 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
18b70 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
18b80 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
18b90 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
18ba0 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
18bb0 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
18bc0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
18bd0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
18be0 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
18bf0 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
18c00 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
18c10 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
18c20 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
18c30 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
18c40 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
18c50 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
18c60 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
18c70 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
18c80 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
18c90 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
18ca0 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
18cb0 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
18cc0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
18cd0 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
18ce0 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
18cf0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
18d00 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
18d10 69 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72  ied behavior for
18d20 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
18d30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18d40 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
18d50 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
18d60 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
18d70 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
18d80 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
18d90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18da0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
18db0 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
18dc0 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
18dd0 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
18de0 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
18df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18e00 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
18e10 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
18e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
18e30 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
18e40 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
18e50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18e60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
18e70 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18e80 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
18e90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69    }.  }..  /* Li
18ea0 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
18eb0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
18ec0 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
18ed0 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
18ee0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
18ef0 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
18f00 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
18f10 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e  t.busy ){.    In
18f20 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65  dex *p;.    asse
18f30 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
18f40 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
18f50 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
18f60 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  a) );.    p = sq
18f70 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
18f80 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
18f90 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ->idxHash, .    
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
18fc0 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
18fd0 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  en30(pIndex->zNa
18fe0 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19000 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
19010 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
19020 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
19030 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
19040 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
19050 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
19060 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
19070 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19080 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
19090 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
190a0 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
190b0 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
190c0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
190d0 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
190e0 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
190f0 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
19100 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
19110 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
19120 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
19130 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
19140 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
19150 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
19160 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
19170 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
19180 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
19190 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
191a0 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
191b0 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
191c0 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
191d0 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
191e0 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
191f0 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
19200 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
19210 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
19220 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
19230 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
19240 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
19250 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
19260 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
19270 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
19280 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
19290 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
192a0 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
192b0 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
192c0 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
192d0 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
192e0 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
192f0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
19300 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
19310 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
19320 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
19330 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
19340 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
19350 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
19360 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
19370 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
19380 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
19390 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
193a0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
193b0 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
193c0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
193d0 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
193e0 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
193f0 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
19400 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
19410 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
19420 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
19430 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
19440 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20  e->nMem;..    v 
19450 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
19460 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
19470 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
19480 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19490 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ...    /* Create
194a0 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
194b0 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  r the index.    
194c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  */.    sqlite3Be
194d0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
194e0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
194f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19500 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
19510 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
19520 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20   iMem);..    /* 
19530 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
19540 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
19550 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
19560 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
19570 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
19580 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
19590 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
195a0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
195b0 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  t)(pParse->sLast
195c0 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d  Token.z - pName-
195d0 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c  >z) + pParse->sL
195e0 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  astToken.n;.    
195f0 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e    if( pName->z[n
19600 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a  -1]==';' ) n--;.
19610 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
19620 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
19630 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
19640 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
19650 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
19660 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
19670 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44  b, "CREATE%s IND
19680 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
19690 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
196a0 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
196b0 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a  UE", n, pName->z
196c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
196d0 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
196e0 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
196f0 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
19700 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
19710 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
19720 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
19730 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
19740 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
19750 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
19760 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
19770 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
19780 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
19790 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
197a0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
197b0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49  rse, .        "I
197c0 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
197d0 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
197e0 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c  %Q,%Q,#%d,%Q);",
197f0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
19800 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
19810 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
19820 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
19830 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70  zName,.        p
19840 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
19850 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20      iMem,.      
19860 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20    zStmt.    );. 
19870 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
19880 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20  (db, zStmt);..  
19890 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e    /* Fill the in
198a0 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e  dex with data an
198b0 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63  d reparse the sc
198c0 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50  hema. Code an OP
198d0 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74  _Expire.    ** t
198e0 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  o invalidate all
198f0 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
19900 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f  atements..    */
19910 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
19920 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
19930 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
19940 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d  arse, pIndex, iM
19950 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
19960 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
19970 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
19980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19990 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76  dParseSchemaOp(v
199a0 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
199b0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
199c0 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e  b, "name='%q' AN
199d0 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
199e0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29   pIndex->zName))
199f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19a00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19a10 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20  Expire, 0);.    
19a20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
19a30 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
19a40 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
19a50 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
19a60 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
19a70 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
19a80 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
19a90 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
19aa0 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
19ab0 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
19ac0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
19ad0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
19ae0 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  ct constraint ch
19af0 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  eck.  ** process
19b00 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47  ing (in sqlite3G
19b10 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
19b20 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61  tChecks()) as pa
19b30 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54  rt of.  ** UPDAT
19b40 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61  E and INSERT sta
19b50 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a  tements.  .  */.
19b60 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
19b70 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
19b80 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
19b90 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
19ba0 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
19bb0 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
19bc0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
19bd0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
19be0 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
19bf0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
19c00 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
19c10 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
19c20 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
19c30 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
19c40 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
19c50 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
19c60 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
19c70 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
19c80 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
19c90 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
19ca0 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
19cb0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
19cc0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
19cd0 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
19ce0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
19cf0 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
19d00 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  ex;.    }.    pR
19d10 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  et = pIndex;.   
19d20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
19d30 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
19d40 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
19d50 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
19d60 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
19d70 78 20 29 20 66 72 65 65 49 6e 64 65 78 28 64 62  x ) freeIndex(db
19d80 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c  , pIndex);.  sql
19d90 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
19da0 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20  b, pPIWhere);.  
19db0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
19dc0 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
19dd0 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
19de0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62  stDelete(db, pTb
19df0 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
19e00 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
19e10 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  e);.  return pRe
19e20 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  t;.}../*.** Fill
19e30 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77   the Index.aiRow
19e40 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  Est[] array with
19e50 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61   default informa
19e60 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69  tion - informati
19e70 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64  on.** to be used
19e80 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f   when we have no
19e90 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a  t run the ANALYZ
19ea0 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
19eb0 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20   aiRowEst[0] is 
19ec0 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61  suppose to conta
19ed0 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
19ee0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
19ef0 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65   index..** Since
19f00 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c   we do not know,
19f10 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e   guess 1 million
19f20 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69  .  aiRowEst[1] i
19f30 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
19f40 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
19f50 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
19f60 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61  ble that match a
19f70 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61  ny particular va
19f80 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  lue of the.** fi
19f90 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  rst column of th
19fa0 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45  e index.  aiRowE
19fb0 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69  st[2] is an esti
19fc0 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
19fd0 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68  er.** of rows th
19fe0 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
19ff0 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61  ticular combinia
1a000 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
1a010 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  t 2 columns.** o
1a020 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e  f the index.  An
1a030 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20  d so forth.  It 
1a040 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74  must always be t
1a050 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a  he case that.*.*
1a060 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1a070 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73  wEst[N]<=aiRowEs
1a080 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20  t[N-1].**       
1a090 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e      aiRowEst[N]>
1a0a0 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66  =1.**.** Apart f
1a0b0 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76  rom that, we hav
1a0c0 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f  e little to go o
1a0d0 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74  n besides intuit
1a0e0 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77  ion as to.** how
1a0f0 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75   aiRowEst[] shou
1a100 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ld be initialize
1a110 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20  d.  The numbers 
1a120 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a  generated here.*
1a130 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74  * are based on t
1a140 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f  ypical values fo
1a150 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e  und in actual in
1a160 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dices..*/.void s
1a170 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
1a180 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29  Est(Index *pIdx)
1a190 7b 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 20 3d  {.  tRowcnt *a =
1a1a0 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b   pIdx->aiRowEst;
1a1b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77  .  int i;.  tRow
1a1c0 63 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  cnt n;.  assert(
1a1d0 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20   a!=0 );.  a[0] 
1a1e0 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1a1f0 6e 52 6f 77 45 73 74 3b 0a 20 20 69 66 28 20 61  nRowEst;.  if( a
1a200 5b 30 5d 3c 31 30 20 29 20 61 5b 30 5d 20 3d 20  [0]<10 ) a[0] = 
1a210 31 30 3b 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20  10;.  n = 10;.  
1a220 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 49 64 78  for(i=1; i<=pIdx
1a230 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
1a240 0a 20 20 20 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20  .    a[i] = n;. 
1a250 20 20 20 69 66 28 20 6e 3e 35 20 29 20 6e 2d 2d     if( n>5 ) n--
1a260 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
1a270 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
1a280 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78  ne ){.    a[pIdx
1a290 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 31 3b 0a  ->nKeyCol] = 1;.
1a2a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
1a2b0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
1a2c0 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
1a2d0 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
1a2e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
1a2f0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
1a300 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
1a310 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1a320 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
1a330 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1a340 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
1a350 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
1a360 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
1a370 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
1a380 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1a390 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
1a3a0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1a3b0 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  nErr==0 );   /* 
1a3c0 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
1a3d0 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
1a3e0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
1a3f0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1a400 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1a410 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
1a420 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
1a430 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
1a440 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1a450 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1a460 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
1a470 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1a480 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
1a490 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
1a4a0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
1a4b0 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
1a4c0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
1a4d0 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
1a4e0 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
1a4f0 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
1a500 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a510 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
1a520 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
1a530 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1a540 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1a550 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
1a560 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
1a570 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1a580 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
1a590 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
1a5a0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
1a5b0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1a5c0 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
1a5d0 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20  autoIndex ){.   
1a5e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a5f0 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
1a600 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1a610 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
1a620 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1a630 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
1a640 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
1a650 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1a660 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1a670 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
1a680 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
1a690 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1a6a0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1a6b0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1a6c0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
1a6d0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
1a6e0 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
1a6f0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
1a700 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
1a710 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1a720 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1a730 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
1a740 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
1a750 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
1a760 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a770 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1a780 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
1a790 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
1a7a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1a7b0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1a7c0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
1a7d0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20  T_TEMPDB && iDb 
1a7e0 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
1a7f0 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
1a800 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a810 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1a820 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
1a830 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
1a840 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
1a850 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1a860 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1a870 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
1a880 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1a890 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
1a8a0 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
1a8b0 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
1a8c0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1a8d0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1a8e0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1a8f0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1a900 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
1a910 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1a920 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
1a930 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
1a940 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
1a950 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e  WHERE name=%Q AN
1a960 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
1a970 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
1a980 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
1a990 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
1a9a0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
1a9b0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
1a9c0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
1a9d0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78  Parse, iDb, "idx
1a9e0 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1a9f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
1aa00 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1aa10 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  e, iDb);.    des
1aa20 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
1aa30 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
1aa40 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
1aa50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1aa60 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
1aa70 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  iDb, 0, 0, pInde
1aa80 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
1aa90 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
1aaa0 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
1aab0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1aac0 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
1aad0 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e  pArray is a poin
1aae0 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
1aaf0 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68  of objects. Each
1ab00 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
1ab10 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
1ab20 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
1ab30 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  . This routine u
1ab40 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61  ses sqlite3DbRea
1ab50 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74  lloc().** to ext
1ab60 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f  end the array so
1ab70 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
1ab80 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f  pace for a new o
1ab90 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64  bject at the end
1aba0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1abb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1abc0 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63  lled, *pnEntry c
1abd0 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72  ontains the curr
1abe0 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ent size of.** t
1abf0 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74  he array (in ent
1ac00 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c  ries - so the al
1ac10 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70  location is ((*p
1ac20 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72  nEntry) * szEntr
1ac30 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74  y) bytes.** in t
1ac40 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  otal)..**.** If 
1ac50 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73  the realloc() is
1ac60 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65   successful (i.e
1ac70 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64  . if no OOM cond
1ac80 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74  ition occurs), t
1ac90 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f  he.** space allo
1aca0 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65  cated for the ne
1acb0 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f  w object is zero
1acc0 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64  ed, *pnEntry upd
1acd0 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65  ated to.** refle
1ace0 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  ct the new size 
1acf0 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64  of the array and
1ad00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1ad10 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
1ad20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70  .** returned. *p
1ad30 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
1ad40 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
1ad50 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  ew array entry i
1ad60 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1ad70 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1ad80 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66   the realloc() f
1ad90 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73  ails, *pIdx is s
1ada0 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74  et to -1, *pnEnt
1adb0 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e  ry remains.** un
1adc0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f  changed and a co
1add0 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74  py of pArray ret
1ade0 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  urned..*/.void *
1adf0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1ae00 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  cate(.  sqlite3 
1ae10 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  *db,      /* Con
1ae20 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1ae30 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1ae40 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ures */.  void *
1ae50 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41  pArray,     /* A
1ae60 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1ae70 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c    Might be reall
1ae80 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
1ae90 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a  szEntry,      /*
1aea0 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62   Size of each ob
1aeb0 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61  ject in the arra
1aec0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  y */.  int *pnEn
1aed0 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
1aee0 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
1aef0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
1af00 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20  /.  int *pIdx   
1af10 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1af20 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65  he index of a ne
1af30 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29  w slot here */.)
1af40 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
1af50 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  nt n = *pnEntry;
1af60 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
1af70 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))==0 ){.    int
1af80 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31   sz = (n==0) ? 1
1af90 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64   : 2*n;.    void
1afa0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
1afb0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
1afc0 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79  rray, sz*szEntry
1afd0 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1afe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
1aff0 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
1b000 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
1b010 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20   }.    pArray = 
1b020 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
1b030 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
1b040 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73   memset(&z[n * s
1b050 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
1b060 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
1b070 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  n;.  ++*pnEntry;
1b080 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
1b090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1b0a0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1b0b0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
1b0c0 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1b0d0 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
1b0e0 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
1b0f0 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
1b100 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1b110 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
1b120 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
1b130 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
1b140 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
1b150 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
1b160 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
1b170 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1b180 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1b190 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1b1a0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1b1b0 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
1b1c0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1b1d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1b1e0 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
1b1f0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1b200 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
1b210 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
1b220 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
1b230 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26  ->a[0]),.      &
1b240 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
1b250 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
1b260 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
1b270 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1b280 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
1b290 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1b2a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1b2b0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1b2c0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
1b2d0 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
1b2e0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
1b2f0 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
1b300 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
1b310 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
1b320 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1b330 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1b340 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1b350 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1b360 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1b370 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
1b380 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1b390 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1b3a0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1b3b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1b3c0 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
1b3d0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1b3e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1b3f0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
1b400 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
1b410 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
1b420 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
1b430 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1b440 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
1b450 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
1b460 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
1b470 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
1b480 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1b490 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
1b4a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1b4b0 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1b4c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1b4d0 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
1b4e0 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
1b4f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
1b500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
1b510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  .}../*.** Expand
1b520 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
1b530 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
1b540 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
1b550 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
1b560 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
1b570 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
1b580 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
1b590 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
1b5a0 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
1b5b0 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
1b5c0 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
1b5d0 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
1b5e0 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
1b5f0 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
1b600 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
1b610 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
1b620 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
1b630 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
1b640 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1b650 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
1b660 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
1b670 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
1b680 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
1b690 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
1b6a0 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
1b6b0 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
1b6c0 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
1b6d0 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
1b6e0 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
1b6f0 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
1b700 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
1b710 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
1b720 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
1b730 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
1b740 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
1b750 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
1b760 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
1b770 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
1b780 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
1b790 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1b7a0 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c  n fails the SrcL
1b7b0 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ist is unchanged
1b7c0 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61  .  The.** db->ma
1b7d0 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
1b7e0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
1b7f0 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rue..*/.SrcList 
1b800 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
1b810 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65  nlarge(.  sqlite
1b820 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
1b830 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1b840 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1b850 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20   OOM errors */. 
1b860 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1b870 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
1b880 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
1b890 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
1b8a0 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
1b8b0 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
1b8c0 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
1b8d0 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
1b8e0 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
1b8f0 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
1b900 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
1b910 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
1b920 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
1b930 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
1b940 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
1b950 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
1b960 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
1b970 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
1b980 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
1b990 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b9a0 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53  iStart<=pSrc->nS
1b9b0 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rc );..  /* Allo
1b9c0 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  cate additional 
1b9d0 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20  space if needed 
1b9e0 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
1b9f0 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
1ba00 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
1ba10 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
1ba20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
1ba30 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
1ba40 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
1ba50 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1ba60 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1ba70 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
1ba80 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
1ba90 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
1baa0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1bab0 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
1bac0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
1bad0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1bae0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1baf0 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
1bb00 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
1bb10 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
1bb20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
1bb30 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
1bb40 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
1bb50 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1bb60 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
1bb70 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 6e 47 6f  nAlloc = (u8)nGo
1bb80 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76  t;.  }..  /* Mov
1bb90 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73  e existing slots
1bba0 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72   that come after
1bbb0 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72   the newly inser
1bbc0 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f  ted slots.  ** o
1bbd0 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f  ut of the way */
1bbe0 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e  .  for(i=pSrc->n
1bbf0 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74  Src-1; i>=iStart
1bc00 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63  ; i--){.    pSrc
1bc10 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20  ->a[i+nExtra] = 
1bc20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a  pSrc->a[i];.  }.
1bc30 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20    pSrc->nSrc += 
1bc40 28 69 38 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f  (i8)nExtra;..  /
1bc50 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79  * Zero the newly
1bc60 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73   allocated slots
1bc70 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53   */.  memset(&pS
1bc80 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30  rc->a[iStart], 0
1bc90 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  , sizeof(pSrc->a
1bca0 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20  [0])*nExtra);.  
1bcb0 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c  for(i=iStart; i<
1bcc0 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69  iStart+nExtra; i
1bcd0 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  ++){.    pSrc->a
1bce0 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [i].iCursor = -1
1bcf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75  ;.  }..  /* Retu
1bd00 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1bd10 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63  the enlarged Src
1bd20 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  List */.  return
1bd30 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pSrc;.}.../*.**
1bd40 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
1bd50 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
1bd60 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
1bd70 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
1bd80 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1bd90 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
1bda0 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
1bdb0 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
1bdc0 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c  if pTable is NUL
1bdd0 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69  L..**.** A SrcLi
1bde0 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1bdf0 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  or NULL if there
1be00 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   is an OOM error
1be10 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  .  The returned.
1be20 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  ** SrcList might
1be30 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1be40 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
1be50 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74   was input or it
1be60 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e   might be.** a n
1be70 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f  ew one.  If an O
1be80 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  OM error does oc
1be90 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70  curs, then the p
1bea0 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c  rior value of pL
1beb0 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69  ist.** that is i
1bec0 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
1bed0 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69  tine is automati
1bee0 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  cally freed..**.
1bef0 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
1bf00 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
1bf10 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
1bf20 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
1bf30 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
1bf40 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
1bf50 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
1bf60 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
1bf70 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
1bf80 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
1bf90 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1bfa0 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
1bfb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1bfc0 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
1bfd0 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
1bfe0 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
1bff0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
1c000 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
1c010 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
1c020 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
1c030 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
1c040 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
1c050 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
1c060 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
1c070 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1c080 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
1c090 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
1c0a0 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
1c0b0 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
1c0c0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
1c0d0 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
1c0e0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1c0f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1c100 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1c110 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
1c120 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
1c130 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
1c140 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
1c150 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
1c160 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
1c170 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1c180 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1c190 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
1c1a0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
1c1b0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
1c1c0 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
1c1d0 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43  base name.  If C
1c1e0 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74   is defined.** t
1c1f0 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e  hen so is B.  In
1c200 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65   other words, we
1c210 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61   never have a ca
1c220 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  se where:.**.** 
1c230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1c240 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1c250 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74  ,0,C);.**.** Bot
1c260 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61  h pTable and pDa
1c270 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d  tabase are assum
1c280 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ed to be quoted.
1c290 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f    They are dequo
1c2a0 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65  ted.** before be
1c2b0 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
1c2c0 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63   SrcList..*/.Src
1c2d0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1c2e0 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71  ListAppend(.  sq
1c2f0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1c300 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1c310 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1c320 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1c330 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
1c340 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
1c350 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
1c360 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
1c370 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
1c380 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1c390 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1c3a0 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
1c3b0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
1c3c0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
1c3d0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
1c3e0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1c3f0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c400 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73  assert( pDatabas
1c410 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d  e==0 || pTable!=
1c420 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  0 );  /* Cannot 
1c430 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42  have C without B
1c440 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
1c450 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1c460 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1c470 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1c480 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
1c490 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1c4a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
1c4b0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
1c4c0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73  .  }.  pList = s
1c4d0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1c4e0 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20  arge(db, pList, 
1c4f0 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
1c500 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1c510 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
1c520 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1c530 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1c540 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c550 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
1c560 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
1c570 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74  c-1];.  if( pDat
1c580 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
1c590 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
1c5a0 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
1c5b0 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
1c5c0 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  se ){.    Token 
1c5d0 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
1c5e0 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
1c5f0 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
1c600 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
1c610 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61    }.  pItem->zNa
1c620 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1c630 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
1c640 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
1c650 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
1c660 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1c670 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b  (db, pDatabase);
1c680 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1c690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
1c6a0 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
1c6b0 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
1c6c0 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
1c6d0 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
1c6e0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1c6f0 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
1c700 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1c710 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1c720 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1c730 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1c740 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
1c750 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1c760 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1c770 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1c780 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
1c790 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
1c7a0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1c7b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
1c7c0 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
1c7d0 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
1c7e0 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
1c7f0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1c800 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
1c810 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1c820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1c830 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1c840 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
1c850 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
1c860 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1c870 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1c880 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
1c890 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
1c8a0 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
1c8b0 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
1c8c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1c8d0 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1c8e0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1c8f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1c900 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1c910 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
1c920 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1c930 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
1c940 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
1c950 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1c960 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
1c970 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1c980 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
1c990 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1c9a0 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1c9b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1c9c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1c9d0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1c9e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1c9f0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64  (db, pItem->zInd
1ca00 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
1ca10 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
1ca20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
1ca30 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1ca40 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1ca50 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
1ca60 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1ca70 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
1ca80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
1ca90 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
1caa0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
1cab0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
1cac0 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
1cad0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1cae0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
1caf0 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
1cb00 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
1cb10 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
1cb20 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
1cb30 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
1cb40 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1cb50 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
1cb60 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
1cb70 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1cb80 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
1cb90 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
1cba0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1cbb0 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
1cbc0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
1cbd0 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1cbe0 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
1cbf0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
1cc00 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
1cc10 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
1cc20 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
1cc30 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
1cc40 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1cc50 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
1cc60 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
1cc70 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
1cc80 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
1cc90 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  a alias, then pA
1cca0 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
1ccb0 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
1ccc0 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
1ccd0 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
1cce0 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
1ccf0 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
1cd00 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
1cd10 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
1cd20 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
1cd30 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
1cd40 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1cd50 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
1cd60 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
1cd70 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
1cd80 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
1cd90 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
1cda0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1cdb0 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1cdc0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
1cdd0 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
1cde0 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
1cdf0 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
1ce00 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
1ce10 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1ce20 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
1ce30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1ce40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1ce50 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1ce60 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
1ce70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ce80 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
1ce90 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
1cea0 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
1ceb0 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1cec0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1ced0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
1cee0 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
1cef0 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
1cf00 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
1cf10 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1cf20 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1cf30 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
1cf40 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
1cf50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cf60 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1cf70 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
1cf80 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
1cf90 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
1cfa0 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
1cfb0 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
1cfc0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
1cfd0 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
1cfe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1cff0 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
1d000 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
1d010 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
1d020 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
1d030 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1d040 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
1d050 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d060 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
1d070 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1d080 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26  >db;.  if( !p &&
1d090 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29   (pOn || pUsing)
1d0a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1d0b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1d0c0 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69  "a JOIN clause i
1d0d0 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
1d0e0 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70  e %s", .      (p
1d0f0 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49  On ? "ON" : "USI
1d100 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  NG").    );.    
1d110 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1d120 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20  _error;.  }.  p 
1d130 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1d140 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54  Append(db, p, pT
1d150 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
1d160 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1d170 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30  NEVER(p->nSrc==0
1d180 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70  ) ){.    goto ap
1d190 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
1d1a0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1d1b0 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1d1c0 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
1d1d0 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
1d1e0 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
1d1f0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
1d200 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1d210 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
1d220 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
1d230 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
1d240 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
1d250 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
1d260 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
1d270 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
1d280 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1d290 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
1d2a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1d2b0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
1d2c0 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
1d2d0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
1d2e0 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
1d2f0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1d300 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
1d310 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1d320 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
1d330 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
1d340 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
1d350 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
1d360 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
1d370 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1d380 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1d390 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1d3a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d3b0 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
1d3c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d3d0 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
1d3e0 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
1d3f0 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1d400 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
1d410 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e   p && ALWAYS(p->
1d420 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73  nSrc>0) ){.    s
1d430 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d440 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1d450 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1d460 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1d470 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26  >notIndexed==0 &
1d480 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d  & pItem->zIndex=
1d490 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
1d4a0 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26  ndexedBy->n==1 &
1d4b0 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a  & !pIndexedBy->z
1d4c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22   ){.      /* A "
1d4d0 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61  NOT INDEXED" cla
1d4e0 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64  use was supplied
1d4f0 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20  . See parse.y . 
1d500 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63       ** construc
1d510 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20  t "indexed_opt" 
1d520 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
1d530 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74        pItem->not
1d540 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
1d550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1d560 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71  tem->zIndex = sq
1d570 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1d580 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1d590 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
1d5a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
1d5b0 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20  hen building up 
1d5c0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  a FROM clause in
1d5d0 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
1d5e0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a   join operator.*
1d5f0 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61  * is initially a
1d600 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
1d610 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75  eft operand.  Bu
1d620 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
1d630 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20  ator.** expects 
1d640 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
1d650 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72  r to be on the r
1d660 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54  ight operand.  T
1d670 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53  his routine.** S
1d680 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f  hifts all join o
1d690 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65  perators from le
1d6a0 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20  ft to right for 
1d6b0 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a  an entire FROM.*
1d6c0 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  * clause..**.** 
1d6d0 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65  Example: Suppose
1d6e0 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b   the join is lik
1d6f0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1d700 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61          A natura
1d710 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a  l cross join B.*
1d720 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  *.** The operato
1d730 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72  r is "natural cr
1d740 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20  oss join".  The 
1d750 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73  A and B operands
1d760 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
1d770 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d  n p->a[0] and p-
1d780 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76  >a[1], respectiv
1d790 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72  ely.  The parser
1d7a0 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65   initially store
1d7b0 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f  s the.** operato
1d7c0 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20  r with A.  This 
1d7d0 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74  routine shifts t
1d7e0 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65  hat operator ove
1d7f0 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20  r to B..*/.void 
1d800 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
1d810 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c  iftJoinType(SrcL
1d820 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ist *p){.  if( p
1d830 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1d840 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 20     assert( p->a 
1d850 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 3b  || p->nSrc==0 );
1d860 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
1d870 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
1d880 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a  .      p->a[i].j
1d890 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69  ointype = p->a[i
1d8a0 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  -1].jointype;.  
1d8b0 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e    }.    p->a[0].
1d8c0 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1d8d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  }.}../*.** Begin
1d8e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1d8f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
1d900 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
1d910 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1d920 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
1d930 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
1d940 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
1d950 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
1d960 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1d970 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
1d980 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66   db!=0 );./*  if
1d990 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  ( db->aDb[0].pBt
1d9a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f  ==0 ) return; */
1d9b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1d9c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1d9d0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
1d9e0 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
1d9f0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1da00 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1da10 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1da20 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
1da30 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
1da40 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
1da50 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1da60 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1da70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1da80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72  eAddOp2(v, OP_Tr
1da90 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
1daa0 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
1dab0 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  E)+1);.      sql
1dac0 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1dad0 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  e(v, i);.    }. 
1dae0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1daf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1db00 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
1db10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1db20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
1db30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
1db40 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
1db50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1db60 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
1db70 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1db80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1db90 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69  se->db!=0 );.  i
1dba0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1dbb0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1dbc0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1dbd0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
1dbe0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1dbf0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1dc00 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1dc10 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1dc20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dc30 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1dc40 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
1dc50 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1dc60 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1dc70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
1dc80 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
1dc90 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1dca0 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  {.  Vdbe *v;..  
1dcb0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1dcc0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1dcd0 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a  Parse->db!=0 );.
1dce0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1dcf0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1dd00 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
1dd10 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
1dd20 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1dd30 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1dd40 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1dd50 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1dd60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1dd70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1dd80 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a  oCommit, 1, 1);.
1dd90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
1dda0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1ddb0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
1ddc0 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65  er when it parse
1ddd0 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63  s a command to c
1dde0 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73  reate,.** releas
1ddf0 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
1de00 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20   SQL savepoint. 
1de10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1de20 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20  Savepoint(Parse 
1de30 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c  *pParse, int op,
1de40 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
1de50 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1de60 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1de70 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1de80 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
1de90 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  Name ){.    Vdbe
1dea0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
1deb0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69  Vdbe(pParse);.#i
1dec0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ded0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1dee0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1def0 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
1df00 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20  [] = { "BEGIN", 
1df10 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c  "RELEASE", "ROLL
1df20 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73  BACK" };.    ass
1df30 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f  ert( !SAVEPOINT_
1df40 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49  BEGIN && SAVEPOI
1df50 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26  NT_RELEASE==1 &&
1df60 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1df70 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ACK==2 );.#endif
1df80 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73  .    if( !v || s
1df90 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1dfa0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
1dfb0 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d  AVEPOINT, az[op]
1dfc0 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20  , zName, 0) ){. 
1dfd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1dfe0 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1dff0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
1e000 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
1e010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e020 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74  (v, OP_Savepoint
1e030 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d  , op, 0, 0, zNam
1e040 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P4_DYNAMIC);.
1e050 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
1e060 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20  e sure the TEMP 
1e070 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1e080 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66   and available f
1e090 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a  or use.  Return.
1e0a0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
1e0b0 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20   errors.  Leave 
1e0c0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
1e0d0 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  es in the pParse
1e0e0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1e0f0 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65  nt sqlite3OpenTe
1e100 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65  mpDatabase(Parse
1e110 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
1e120 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1e130 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
1e140 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26  >aDb[1].pBt==0 &
1e150 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  & !pParse->expla
1e160 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  in ){.    int rc
1e170 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  ;.    Btree *pBt
1e180 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1e190 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a  st int flags = .
1e1a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1e1b0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
1e1c0 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1e1d0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
1e1e0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1e1f0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1e200 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1e210 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1e220 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
1e230 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
1e240 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20  EMP_DB;..    rc 
1e250 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
1e260 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20  en(db->pVfs, 0, 
1e270 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61  db, &pBt, 0, fla
1e280 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  gs);.    if( rc!
1e290 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e2a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1e2b0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
1e2c0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
1e2d0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
1e2e0 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
1e2f0 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
1e300 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
1e310 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
1e320 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
1e330 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1e340 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74    db->aDb[1].pBt
1e350 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65   = pBt;.    asse
1e360 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  rt( db->aDb[1].p
1e370 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
1e380 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
1e390 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1e3a0 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
1e3b0 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d  >nextPagesize, -
1e3c0 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64  1, 0) ){.      d
1e3d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1e3e0 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
1e3f0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1e400 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1e410 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
1e420 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  E code that will
1e430 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
1e440 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74  ma cookie and st
1e450 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72  art.** a read-tr
1e460 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c  ansaction for al
1e470 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  l named database
1e480 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74   files..**.** It
1e490 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
1e4a0 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f  at all schema co
1e4b0 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65  okies be verifie
1e4c0 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61  d and all.** rea
1e4d0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62  d transactions b
1e4e0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
1e4f0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68   anything else h
1e500 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65  appens in.** the
1e510 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
1e520 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
1e530 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61   can be called a
1e540 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a  fter much other.
1e550 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  ** code has been
1e560 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20   generated.  So 
1e570 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20  here is what we 
1e580 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  do:.**.** The fi
1e590 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
1e5a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1e5b0 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47   we code an OP_G
1e5c0 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  oto that.** will
1e5d0 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f   jump to a subro
1e5e0 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64  utine at the end
1e5f0 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
1e600 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63    Then we.** rec
1e610 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61  ord every databa
1e620 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74  se that needs it
1e630 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65  s schema verifie
1e640 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72  d in the.** pPar
1e650 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66  se->cookieMask f
1e660 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66  ield.  Later, af
1e670 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f  ter all other co
1e680 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67  de has been.** g
1e690 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75  enerated, the su
1e6a0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f  broutine that do
1e6b0 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  es the cookie ve
1e6c0 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a  rifications and.
1e6d0 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72  ** starts the tr
1e6e0 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20  ansactions will 
1e6f0 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65  be coded and the
1e700 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75   OP_Goto P2 valu
1e710 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64  e.** will be mad
1e720 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
1e730 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  at subroutine.  
1e740 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  The generation o
1e750 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20  f the.** cookie 
1e760 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62  verification sub
1e770 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70  routine code hap
1e780 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46  pens in sqlite3F
1e790 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
1e7a0 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68  *.** If iDb<0 th
1e7b0 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47  en code the OP_G
1e7c0 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74  oto only - don't
1e7d0 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72   set flag to ver
1e7e0 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d  ify the.** schem
1e7f0 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73  a on any databas
1e800 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  es.  This can be
1e810 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f   used to positio
1e820 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a  n the OP_Goto.**
1e830 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f   early in the co
1e840 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e  de, before we kn
1e850 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61  ow if any databa
1e860 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62  se tables will b
1e870 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  e used..*/.void 
1e880 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1e890 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
1e8a0 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
1e8b0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
1e8c0 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1e8d0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1e8e0 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  e);..#ifndef SQL
1e8f0 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
1e900 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c  .  if( pToplevel
1e910 21 3d 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  !=pParse ){.    
1e920 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
1e930 73 20 74 61 6b 65 6e 20 69 66 20 61 20 74 72 69  s taken if a tri
1e940 67 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  gger is currentl
1e950 79 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 49  y being coded. I
1e960 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 61  n this.    ** ca
1e970 73 65 2c 20 73 65 74 20 63 6f 6f 6b 69 65 47 6f  se, set cookieGo
1e980 74 6f 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  to to a non-zero
1e990 20 76 61 6c 75 65 20 74 6f 20 73 68 6f 77 20 74   value to show t
1e9a0 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
1e9b0 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
1e9c0 6e 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 69  n called. This i
1e9d0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71  s used by the sq
1e9e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e  lite3ExprCodeCon
1e9f0 73 74 61 6e 74 73 28 29 0a 20 20 20 20 2a 2a 20  stants().    ** 
1ea00 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
1ea10 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1ea20 6f 74 6f 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65  oto = -1;.  }.#e
1ea30 6e 64 69 66 0a 20 20 69 66 28 20 70 54 6f 70 6c  ndif.  if( pTopl
1ea40 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  evel->cookieGoto
1ea50 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==0 ){.    Vdbe 
1ea60 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1ea70 64 62 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  dbe(pToplevel);.
1ea80 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
1ea90 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
1eaa0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
1eab0 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
1eac0 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70  r error */.    p
1ead0 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1eae0 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
1eaf0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1eb00 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20  oto, 0, 0)+1;.  
1eb10 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29  }.  if( iDb>=0 )
1eb20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
1eb30 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64  b = pToplevel->d
1eb40 62 3b 0a 20 20 20 20 79 44 62 4d 61 73 6b 20 6d  b;.    yDbMask m
1eb50 61 73 6b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ask;..    assert
1eb60 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
1eb70 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
1eb80 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
1eb90 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
1eba0 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51    assert( iDb<SQ
1ebb0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
1ebc0 44 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  D+2 );.    asser
1ebd0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1ebe0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
1ebf0 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 61 73  b, 0) );.    mas
1ec00 6b 20 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29  k = ((yDbMask)1)
1ec10 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28  <<iDb;.    if( (
1ec20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
1ec30 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
1ec40 20 29 7b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65   ){.      pTople
1ec50 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  vel->cookieMask 
1ec60 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
1ec70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1ec80 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
1ec90 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
1eca0 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
1ecb0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  ;.      if( !OMI
1ecc0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
1ecd0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1ece0 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
1ecf0 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29  abase(pToplevel)
1ed00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ed10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
1ed20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20  argument zDb is 
1ed30 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20  NULL, then call 
1ed40 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1ed50 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61  ySchema() for ea
1ed60 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ch .** attached 
1ed70 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77  database. Otherw
1ed80 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66  ise, invoke it f
1ed90 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1eda0 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a  named zDb only..
1edb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
1edc0 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1edd0 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
1ede0 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1edf0 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  zDb){.  sqlite3 
1ee00 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1ee10 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
1ee20 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1ee30 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
1ee40 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
1ee50 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
1ee60 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30  Bt && (!zDb || 0
1ee70 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1ee80 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  (zDb, pDb->zName
1ee90 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
1eea0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1eeb0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
1eec0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1eed0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
1eee0 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
1eef0 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
1ef00 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
1ef10 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
1ef20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
1ef30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ef40 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
1ef50 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
1ef60 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
1ef70 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
1ef80 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
1ef90 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
1efa0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
1efb0 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
1efc0 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
1efd0 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
1efe0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
1eff0 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
1f000 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
1f010 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
1f020 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
1f030 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
1f040 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
1f050 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
1f060 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
1f070 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
1f080 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
1f090 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
1f0a0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
1f0b0 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
1f0c0 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
1f0d0 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
1f0e0 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
1f0f0 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
1f100 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
1f110 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1f120 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
1f130 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
1f140 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
1f150 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
1f160 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
1f170 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
1f180 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1f190 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
1f1a0 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
1f1b0 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
1f1c0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1f1d0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1f1e0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1f1f0 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
1f200 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
1f210 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1f220 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65  pToplevel->write
1f230 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73  Mask |= ((yDbMas
1f240 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 70 54 6f  k)1)<<iDb;.  pTo
1f250 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
1f260 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65  rite |= setState
1f270 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ment;.}../*.** I
1f280 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1f290 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65   statement curre
1f2a0 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
1f2b0 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72  ruction might wr
1f2c0 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ite.** more than
1f2d0 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d   one entry (exam
1f2e0 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e  ple: deleting on
1f2f0 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72  e row then inser
1f300 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a  ting another,.**
1f310 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69   inserting multi
1f320 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61  ple rows in a ta
1f330 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e  ble, or insertin
1f340 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65  g a row and inde
1f350 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49  x entries.).** I
1f360 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72  f an abort occur
1f370 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20  s after some of 
1f380 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76  these writes hav
1f390 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65  e completed, the
1f3a0 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  n it will.** be 
1f3b0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1f3c0 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20  o the completed 
1f3d0 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  writes..*/.void 
1f3e0 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
1f3f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1f400 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1f410 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1f420 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1f430 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
1f440 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d  ->isMultiWrite =
1f450 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68   1;.}../* .** Th
1f460 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
1f470 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
1f480 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76  ine if is discov
1f490 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a  ers that it is.*
1f4a0 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62  * possible to ab
1f4b0 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ort a statement 
1f4c0 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74  prior to complet
1f4d0 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ion.  In order t
1f4e0 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68  o .** perform th
1f4f0 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74  is abort without
1f500 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20   corrupting the 
1f510 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65  database, we nee
1f520 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72  d to make.** sur
1f530 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
1f540 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65  ment is protecte
1f550 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74  d by a statement
1f560 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1f570 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c  .** Technically,
1f580 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
1f590 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72   set the mayAbor
1f5a0 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a  t flag if the.**
1f5b0 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c   isMultiWrite fl
1f5c0 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ag was previousl
1f5d0 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73  y set.  There is
1f5e0 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e   a time dependen
1f5f0 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20  cy.** such that 
1f600 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f  the abort must o
1f610 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d  ccur after the m
1f620 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73  ultiwrite.  This
1f630 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73   makes.** some s
1f640 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76  tatements involv
1f650 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20  ing the REPLACE 
1f660 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
1f670 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a  ion algorithm.**
1f680 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73   go a little fas
1f690 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67  ter.  But taking
1f6a0 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
1f6b0 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e  is time dependen
1f6c0 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d  cy.** makes it m
1f6d0 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f  ore difficult to
1f6e0 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
1f6f0 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20  code is correct 
1f700 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c  (in .** particul
1f710 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20  ar, it prevents 
1f720 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  us from writing 
1f730 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20  an effective.** 
1f740 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1f750 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  f sqlite3AssertM
1f760 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73  ayAbort()) and s
1f770 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e  o we have chosen
1f780 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20  .** to take the 
1f790 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73  safe route and s
1f7a0 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  kip the optimiza
1f7b0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
1f7c0 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61  lite3MayAbort(Pa
1f7d0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1f7e0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1f7f0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1f800 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1f810 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61  .  pToplevel->ma
1f820 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  yAbort = 1;.}../
1f830 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
1f840 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73  Halt that causes
1f850 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74   the vdbe to ret
1f860 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
1f870 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f  NSTRAINT.** erro
1f880 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70  r. The onError p
1f890 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
1f8a0 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e  nes which (if an
1f8b0 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  y) of the statem
1f8c0 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75  ent.** and/or cu
1f8d0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1f8e0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1f8f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f900 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
1f910 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1f920 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1f930 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1f940 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f   errCode,      /
1f950 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72  * extended error
1f960 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   code */.  int o
1f970 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
1f980 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
1f990 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20  */.  char *p4,  
1f9a0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
1f9b0 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 6e 74  message */.  int
1f9c0 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 2f   p4type        /
1f9d0 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50  * P4_STATIC or P
1f9e0 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 29  4_TRANSIENT */.)
1f9f0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
1fa00 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1fa10 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
1fa20 28 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d  (errCode&0xff)==
1fa30 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1fa40 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72  T );.  if( onErr
1fa50 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  or==OE_Abort ){.
1fa60 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
1fa70 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ort(pParse);.  }
1fa80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1fa90 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp4(v, OP_Halt,
1faa0 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f   errCode, onErro
1fab0 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65  r, 0, p4, p4type
1fac0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
1fad0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
1fae0 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
1faf0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1fb00 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
1fb10 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
1fb20 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
1fb30 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
1fb40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fb50 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1fb60 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
1fb70 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
1fb80 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  zColl, Index *pI
1fb90 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ndex){.  int i;.
1fba0 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21    assert( zColl!
1fbb0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
1fbc0 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   i<pIndex->nColu
1fbd0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  mn; i++){.    co
1fbe0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49  nst char *z = pI
1fbf0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  ndex->azColl[i];
1fc00 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
1fc10 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43  0 || pIndex->aiC
1fc20 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20  olumn[i]<0 );.  
1fc30 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69    if( pIndex->ai
1fc40 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20  Column[i]>=0 && 
1fc50 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
1fc60 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  p(z, zColl) ){. 
1fc70 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1fc80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1fc90 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
1fca0 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
1fcb0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
1fcc0 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ab that use the 
1fcd0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1fce0 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20  ce pColl..** If 
1fcf0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
1fd00 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1fd10 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a  ces of pTab..*/.
1fd20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fd30 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1fd40 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54  ic void reindexT
1fd50 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
1fd60 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
1fd70 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
1fd80 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
1fd90 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
1fda0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
1fdb0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1fdc0 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
1fdd0 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
1fde0 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
1fdf0 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
1fe00 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d  {.    if( zColl=
1fe10 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
1fe20 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64  atch(zColl, pInd
1fe30 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ex) ){.      int
1fe40 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1fe50 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
1fe60 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
1fe70 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71  chema);.      sq
1fe80 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1fe90 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1fea0 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
1feb0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1fec0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1fed0 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  x, -1);.    }.  
1fee0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
1fef0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
1ff00 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74  indices of all t
1ff10 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  ables in all dat
1ff20 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65  abases where the
1ff30 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20  .** indices use 
1ff40 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
1ff50 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49  quence pColl.  I
1ff60 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
1ff70 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c  recompute.** all
1ff80 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68   indices everywh
1ff90 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ere..*/.#ifndef 
1ffa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
1ffb0 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
1ffc0 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1ffd0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ffe0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1fff0 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20010 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
20020 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
20030 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
20040 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
20050 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
20060 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
20070 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
20080 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
20090 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
200a0 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
200b0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
200c0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
200d0 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
200e0 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
200f0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
20100 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
20110 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
20120 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
20130 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
20140 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
20150 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20    /* Needed for 
20160 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f  schema access */
20170 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44  .  for(iDb=0, pD
20180 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64  b=db->aDb; iDb<d
20190 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70  b->nDb; iDb++, p
201a0 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  Db++){.    asser
201b0 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20  t( pDb!=0 );.   
201c0 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
201d0 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
201e0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
201f0 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
20200 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
20210 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
20220 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
20230 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
20240 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
20250 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, zColl);.    }
20260 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
20270 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
20280 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
20290 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
202a0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202c0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
202d0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
202e0 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
20300 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
20310 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
20320 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
20330 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
20340 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
20350 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
20360 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
20370 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
20380 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
20390 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
203a0 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
203b0 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
203c0 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
203d0 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
203e0 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
203f0 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
20400 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
20410 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
20420 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
20430 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
20440 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
20450 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
20460 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
20470 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
20480 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
20490 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
204a0 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
204b0 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
204c0 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
204d0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
204e0 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
204f0 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
20500 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
20510 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20530 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
20540 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
20550 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
20560 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
20570 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
20580 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
20590 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
205a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
205b0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
205c0 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
205d0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
205e0 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
205f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20600 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
20610 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
20620 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
20630 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
20640 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
20650 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
20660 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
20670 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
20680 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
20690 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
206a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
206b0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
206c0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
206d0 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
206e0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
206f0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
20700 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
20710 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
20720 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
20730 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
20740 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
20750 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
20760 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
20770 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
20780 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
20790 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ame1==0 ){.    r
207a0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
207b0 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
207c0 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
207d0 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32  if( NEVER(pName2
207e0 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  ==0) || pName2->
207f0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  z==0 ){.    char
20800 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73   *zColl;.    ass
20810 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29  ert( pName1->z )
20820 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  ;.    zColl = sq
20830 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
20840 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
20850 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
20860 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
20870 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
20880 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
20890 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
208a0 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ll, 0);.    if( 
208b0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
208c0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
208d0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
208e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
208f0 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
20900 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
20910 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
20920 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
20930 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
20940 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
20950 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
20960 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
20970 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
20980 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
20990 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
209a0 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61  Token(db, pObjNa
209b0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
209c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20  ) return;.  zDb 
209d0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
209e0 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
209f0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
20a00 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
20a10 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
20a20 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
20a30 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
20a40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20a50 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75  db, z);.    retu
20a60 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
20a70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
20a80 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
20a90 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
20aa0 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70  (db, z);.  if( p
20ab0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
20ac0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
20ad0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
20ae0 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
20af0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
20b00 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
20b10 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
20b20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
20b30 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
20b40 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
20b50 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
20b60 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
20b70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20b80 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69   Return a dynami
20b90 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65  cly allocated Ke
20ba0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
20bb0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
20bc0 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e  .** with OP_Open
20bd0 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57  Read or OP_OpenW
20be0 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64  rite to access d
20bf0 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49  atabase index pI
20c00 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  dx..**.** If suc
20c10 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74  cessful, a point
20c20 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  er to the new st
20c30 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72  ructure is retur
20c40 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
20c50 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  e.** the caller 
20c60 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
20c70 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  or calling sqlit
20c80 65 33 44 62 46 72 65 65 28 64 62 2c 20 29 20 6f  e3DbFree(db, ) o
20c90 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a  n the returned .
20ca0 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61  ** pointer. If a
20cb0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  n error occurs (
20cc0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72  out of memory or
20cd0 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69   missing collati
20ce0 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29  on .** sequence)
20cf0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
20d00 65 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  ed and the state
20d10 20 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74   of pParse updat
20d20 65 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a  ed to reflect.**
20d30 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b   the error..*/.K
20d40 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49  eyInfo *sqlite3I
20d50 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73  ndexKeyinfo(Pars
20d60 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
20d70 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69   *pIdx){.  int i
20d80 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  ;.  int nCol = p
20d90 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
20da0 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d  int nKey = pIdx-
20db0 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49  >nKeyCol;.  KeyI
20dc0 6e 66 6f 20 2a 70 4b 65 79 3b 0a 0a 20 20 70 4b  nfo *pKey;..  pK
20dd0 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
20de0 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
20df0 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d  >db, nKey, nCol-
20e00 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20 70 4b 65  nKey);.  if( pKe
20e10 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
20e20 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
20e30 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
20e40 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
20e50 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
20e60 43 6f 6c 6c 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20  Coll==0 ) zColl 
20e70 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
20e80 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
20e90 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
20ea0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
20eb0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b  zColl);.      pK
20ec0 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
20ed0 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
20ee0 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
20ef0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65   }..  if( pParse
20f00 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
20f10 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
20f20 73 65 2d 3e 64 62 2c 20 70 4b 65 79 29 3b 0a 20  se->db, pKey);. 
20f30 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     pKey = 0;.  }
20f40 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a  .  return pKey;.
20f50 7d 0a                                            }.