/ Hex Artifact Content
Login

Artifact d4d5ceedf196a7da36d6dd15f4d073cb68c8f079:


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 69 66 28 20 64 62 3d  #endif.  if( db=
3130: 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65  =0 || db->pnByte
3140: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
3150: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
3160: 70 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  p->pKeyInfo);.  
3170: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3180: 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64  e(db, p->pPartId
3190: 78 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  xWhere);.  sqlit
31a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
31b0: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28 20  zColAff);.  if( 
31c0: 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20 73  p->isResized ) s
31d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
31e0: 20 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 73   p->azColl);.  s
31f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3200: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f   p);.}../*.** Fo
3210: 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c  r the index call
3220: 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63  ed zIdxName whic
3230: 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  h is found in th
3240: 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a  e database iDb,.
3250: 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69  ** unlike that i
3260: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61  ndex from its Ta
3270: 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ble then remove 
3280: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a  the index from.*
3290: 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  * the index hash
32a0: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
32b0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  all memory struc
32c0: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
32d0: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64  .** with the ind
32e0: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
32f0: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
3300: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
3310: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
3320: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
3330: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
3340: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  ndex;.  int len;
3350: 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  .  Hash *pHash;.
3360: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3370: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
3380: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
3390: 0a 20 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e  .  pHash = &db->
33a0: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
33b0: 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 6c 65 6e  ->idxHash;.  len
33c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
33d0: 33 30 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20  30(zIdxName);.  
33e0: 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
33f0: 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68  HashInsert(pHash
3400: 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2c  , zIdxName, len,
3410: 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59   0);.  if( ALWAY
3420: 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  S(pIndex) ){.   
3430: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
3440: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
3450: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
3460: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
3470: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
3480: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
3490: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
34a0: 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69        /* Justifi
34b0: 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53  cation of ALWAYS
34c0: 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d  ();  The index m
34d0: 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69  ust be on the li
34e0: 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69  st of.      ** i
34f0: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20  ndices. */.     
3500: 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61   p = pIndex->pTa
3510: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ble->pIndex;.   
3520: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
3530: 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  (p) && p->pNext!
3540: 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70  =pIndex ){ p = p
3550: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20  ->pNext; }.     
3560: 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26   if( ALWAYS(p &&
3570: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3580: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  x) ){.        p-
3590: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
35a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
35b0: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
35c0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
35d0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
35e0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
35f0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3600: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3610: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3620: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3630: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3640: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3650: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3660: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3670: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3680: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3690: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
36a0: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
36b0: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
36c0: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
36d0: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
36e0: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
36f0: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3700: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3710: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3720: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3730: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3740: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3750: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3760: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3770: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3780: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3790: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
37a0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
37b0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
37c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
37d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
37e0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
37f0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
3800: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
3810: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
3820: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3830: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3840: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3850: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   j++;.  }.  mems
3860: 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20  et(&db->aDb[j], 
3870: 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73  0, (db->nDb-j)*s
3880: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d  izeof(db->aDb[j]
3890: 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ));.  db->nDb = 
38a0: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
38b0: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
38c0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
38d0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
38e0: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
38f0: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
3900: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
3910: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3920: 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64   db->aDb);.    d
3930: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
3940: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
3950: 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73  *.** Reset the s
3960: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61  chema for the da
3970: 74 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20  tabase at index 
3980: 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74  iDb.  Also reset
3990: 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68   the.** TEMP sch
39a0: 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ema..*/.void sql
39b0: 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65  ite3ResetOneSche
39c0: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
39d0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 44 62 20 2a  int iDb){.  Db *
39e0: 70 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69  pDb;.  assert( i
39f0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
3a00: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 52 65 73   /* Case 1:  Res
3a10: 65 74 20 74 68 65 20 73 69 6e 67 6c 65 20 73 63  et the single sc
3a20: 68 65 6d 61 20 69 64 65 6e 74 69 66 69 65 64 20  hema identified 
3a30: 62 79 20 69 44 62 20 2a 2f 0a 20 20 70 44 62 20  by iDb */.  pDb 
3a40: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
3a50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3a60: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
3a70: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
3a80: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
3a90: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
3aa0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
3ab0: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
3ac0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 64  ;..  /* If any d
3ad0: 61 74 61 62 61 73 65 20 6f 74 68 65 72 20 74 68  atabase other th
3ae0: 61 6e 20 54 45 4d 50 20 69 73 20 72 65 73 65 74  an TEMP is reset
3af0: 2c 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 73 65  , then also rese
3b00: 74 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69 6e 63  t TEMP.  ** sinc
3b10: 65 20 54 45 4d 50 20 6d 69 67 68 74 20 62 65 20  e TEMP might be 
3b20: 68 6f 6c 64 69 6e 67 20 74 72 69 67 67 65 72 73  holding triggers
3b30: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
3b40: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20  tables in the.  
3b50: 2a 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ** other databas
3b60: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44  e..  */.  if( iD
3b70: 62 21 3d 31 20 29 7b 0a 20 20 20 20 70 44 62 20  b!=1 ){.    pDb 
3b80: 3d 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20  = &db->aDb[1];. 
3b90: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
3ba0: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
3bb0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
3bc0: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
3bd0: 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  a);.  }.  return
3be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
3bf0: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
3c00: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c  rmation from all
3c10: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
3c20: 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a  ses (including.*
3c30: 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65  * "main" and "te
3c40: 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c  mp") for a singl
3c50: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
3c60: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
3c70: 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
3c80: 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
3c90: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  n(sqlite3 *db){.
3ca0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
3cb0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
3cc0: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
3cd0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3ce0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
3cf0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3d00: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
3d10: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3d20: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
3d30: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3d40: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
3d50: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3d60: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
3d70: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
3d80: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
3d90: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
3da0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  db);.  sqlite3Co
3db0: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
3dc0: 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ray(db);.}../*.*
3dd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3de0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
3df0: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
3e00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
3e10: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
3e20: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
3e30: 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  {.  db->flags &=
3e40: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
3e50: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
3e60: 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61   Delete memory a
3e70: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
3e80: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
3e90: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
3ea0: 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61   (the.** Table.a
3eb0: 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f  Col[] array)..*/
3ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
3ed0: 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  iteDeleteColumnN
3ee0: 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ames(sqlite3 *db
3ef0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
3f00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  {.  int i;.  Col
3f10: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73  umn *pCol;.  ass
3f20: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
3f30: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
3f40: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
3f50: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
3f60: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
3f70: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
3f80: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3f90: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
3fa0: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
3fb0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
3fc0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
3fd0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3fe0: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66  ee(db, pCol->zDf
3ff0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
4000: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
4010: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  l->zType);.     
4020: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4030: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
4040: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4050: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4060: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
4070: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4080: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
4090: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
40a0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
40b0: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
40c0: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
40d0: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
40e0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
40f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4100: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
4110: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
4120: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
4130: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
4140: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
4150: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4160: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
4170: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
4180: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
4190: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
41a0: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
41b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
41c0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
41d0: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
41e0: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
41f0: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
4200: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
4210: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
4220: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
4230: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
4240: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
4250: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
4260: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4270: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4280: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4290: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
42a0: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
42b0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
42c0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
42d0: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
42e0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
42f0: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
4300: 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ect..*/.void sql
4310: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
4320: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4330: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
4340: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
4350: 4e 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Next;.  TESTONLY
4360: 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65  ( int nLookaside
4370: 3b 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20 76  ; ) /* Used to v
4380: 65 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20  erify lookaside 
4390: 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63 68  not used for sch
43a0: 65 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ema */..  assert
43b0: 28 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54 61  ( !pTable || pTa
43c0: 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  ble->nRef>0 );..
43d0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65    /* Do not dele
43e0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74  te the table unt
43f0: 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  il the reference
4400: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
4410: 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70  ero. */.  if( !p
4420: 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a  Table ) return;.
4430: 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64    if( ((!db || d
4440: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4450: 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65  =0) && (--pTable
4460: 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65 74  ->nRef)>0) ) ret
4470: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  urn;..  /* Recor
4480: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
4490: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b  outstanding look
44a0: 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  aside allocation
44b0: 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c  s in schema Tabl
44c0: 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f  es.  ** prior to
44d0: 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28   doing any free(
44e0: 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53  ) operations.  S
44f0: 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c  ince schema Tabl
4500: 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20  es do not use.  
4510: 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68  ** lookaside, th
4520: 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64  is number should
4530: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a   not change. */.
4540: 20 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f    TESTONLY( nLoo
4550: 6b 61 73 69 64 65 20 3d 20 28 64 62 20 26 26 20  kaside = (db && 
4560: 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67  (pTable->tabFlag
4570: 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
4580: 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
45b0: 4f 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a  Out : 0 );..  /*
45c0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69   Delete all indi
45d0: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
45e0: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20  ith this table. 
45f0: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
4600: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
4610: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
4620: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
4630: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
4640: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
4650: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d  pIndex->pSchema=
4660: 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61  =pTable->pSchema
4670: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 20   );.    if( !db 
4680: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
4690: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
46a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49  char *zName = pI
46b0: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20  ndex->zName; .  
46c0: 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49      TESTONLY ( I
46d0: 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73  ndex *pOld = ) s
46e0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
46f0: 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e 64  (.         &pInd
4700: 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
4710: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c  Hash, zName, sql
4720: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
4730: 6d 65 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  me), 0.      );.
4740: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
4750: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63  ==0 || sqlite3Sc
4760: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4770: 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  , 0, pIndex->pSc
4780: 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61  hema) );.      a
4790: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e  ssert( pOld==pIn
47a0: 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29  dex || pOld==0 )
47b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
47c0: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
47d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
47e0: 65 74 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20  ete any foreign 
47f0: 6b 65 79 73 20 61 74 74 61 63 68 65 64 20 74 6f  keys attached to
4800: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
4810: 20 20 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74    sqlite3FkDelet
4820: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a  e(db, pTable);..
4830: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
4840: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
4850: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
4860: 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d  qliteDeleteColum
4870: 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c  nNames(db, pTabl
4880: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
4890: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
48a0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
48b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
48c0: 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  le->zColAff);.  
48d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
48e0: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ete(db, pTable->
48f0: 70 53 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65  pSelect);.#ifnde
4900: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
4910: 45 43 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ECK.  sqlite3Exp
4920: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
4930: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
4940: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
4950: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
4960: 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  UALTABLE.  sqlit
4970: 65 33 56 74 61 62 43 6c 65 61 72 28 64 62 2c 20  e3VtabClear(db, 
4980: 70 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  pTable);.#endif.
4990: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
49a0: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
49b0: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 6e  /* Verify that n
49c0: 6f 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  o lookaside memo
49d0: 72 79 20 77 61 73 20 75 73 65 64 20 62 79 20 73  ry was used by s
49e0: 63 68 65 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a  chema tables */.
49f0: 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61    assert( nLooka
4a00: 73 69 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b  side==0 || nLook
4a10: 61 73 69 64 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61  aside==db->looka
4a20: 73 69 64 65 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 0a  side.nOut );.}..
4a30: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
4a40: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
4a50: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
4a60: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
4a70: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
4a80: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
4a90: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
4aa0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
4ab0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
4ac0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
4ad0: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
4ae0: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
4af0: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a  har *zTabName){.
4b00: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62    Table *p;.  Db
4b10: 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
4b20: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
4b30: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
4b40: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
4b50: 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65  assert( zTabName
4b60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
4b70: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
4b80: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
4b90: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
4ba0: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  zTabName[0]==0 )
4bb0: 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74  ;  /* Zero-lengt
4bc0: 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72  h table names ar
4bd0: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70  e allowed */.  p
4be0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
4bf0: 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  b];.  p = sqlite
4c00: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
4c10: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
4c20: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 0a 20 20  sh, zTabName,.  
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
4c50: 6c 65 6e 33 30 28 7a 54 61 62 4e 61 6d 65 29 2c  len30(zTabName),
4c60: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  0);.  sqlite3Del
4c70: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
4c80: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
4c90: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
4ca0: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  nges;.}../*.** G
4cb0: 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65  iven a token, re
4cc0: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
4cd0: 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  at consists of t
4ce0: 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a  he text of that.
4cf0: 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65  ** token.  Space
4d00: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
4d10: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
4d20: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
4d30: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
4d40: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
4d50: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
4d60: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  .** function..**
4d70: 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f  .** Any quotatio
4d80: 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e  n marks (ex:  "n
4d90: 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e  ame", 'name', [n
4da0: 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29  ame], or `name`)
4db0: 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e   that.** surroun
4dc0: 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  d the body of th
4dd0: 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f  e token are remo
4de0: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e  ved..**.** Token
4df0: 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74  s are often just
4e00: 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74   pointers into t
4e10: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
4e20: 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61  text and so.** a
4e30: 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d  re not \000 term
4e40: 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e  inated and are n
4e50: 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20  ot persistent.  
4e60: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
4e70: 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74  ing.** is \000 t
4e80: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73  erminated and is
4e90: 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a   persistent..*/.
4ea0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d  char *sqlite3Nam
4eb0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74  eFromToken(sqlit
4ec0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
4ed0: 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
4ee0: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d  Name;.  if( pNam
4ef0: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
4f00: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
4f10: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61  p(db, (char*)pNa
4f20: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
4f30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
4f40: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
4f50: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
4f60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4f70: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
4f80: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
4f90: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
4fa0: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
4fb0: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
4fc0: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
4fd0: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
4fe0: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
4ff0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5000: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
5010: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
5020: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
5030: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
5040: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
5050: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
5060: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43  STER_ROOT, 1, SC
5070: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
5080: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5090: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f  ddOp4Int(v, OP_O
50a0: 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53  penWrite, 0, MAS
50b0: 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 2c 20 35  TER_ROOT, iDb, 5
50c0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62  );.  if( p->nTab
50d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54  ==0 ){.    p->nT
50e0: 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ab = 1;.  }.}../
50f0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
5100: 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  Name points to a
5110: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
5120: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
5130: 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  g the name.** of
5140: 20 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61   a database ("ma
5150: 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74  in", "temp" or t
5160: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
5170: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
5180: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
5190: 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f  urns the index o
51a0: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
51b0: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
51c0: 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74  ], or.** -1 if t
51d0: 68 65 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e  he named db cann
51e0: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
51f0: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
5200: 62 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  bName(sqlite3 *d
5210: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
5220: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
5230: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
5240: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5250: 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  */.  if( zName )
5260: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20  {.    Db *pDb;. 
5270: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
5280: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
5290: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62  );.    for(i=(db
52a0: 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64  ->nDb-1), pDb=&d
52b0: 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b  b->aDb[i]; i>=0;
52c0: 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20   i--, pDb--){.  
52d0: 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54      if( (!OMIT_T
52e0: 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20  EMPDB || i!=1 ) 
52f0: 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72  && n==sqlite3Str
5300: 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65  len30(pDb->zName
5310: 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  ) && .          
5320: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
5330: 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  p(pDb->zName, zN
5340: 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
5350: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5360: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5370: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n i;.}../*.** Th
5380: 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63  e token *pName c
5390: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
53a0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
53b0: 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72  either "main" or
53c0: 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68  .** "temp" or th
53d0: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
53e0: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20  ached db). This 
53f0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
5400: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
5410: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
5420: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
5430: 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61   or -1 if the na
5440: 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20  med db .** does 
5450: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e  not exist..*/.in
5460: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  t sqlite3FindDb(
5470: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
5480: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e  en *pName){.  in
5490: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
54c0: 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  umber */.  char 
54d0: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73  /* Name we are s
5500: 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a  earching for */.
5510: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
5520: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
5530: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d  b, pName);.  i =
5540: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
5550: 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  me(db, zName);. 
5560: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5570: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
5580: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn i;.}../* The
5590: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f   table or view o
55a0: 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69  r trigger name i
55b0: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
55c0: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b   routine via tok
55d0: 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  ens.** pName1 an
55e0: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
55f0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5600: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5610: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   for example:.**
5620: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
5630: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
5640: 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  ** .** Then pNam
5650: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
5660: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
5670: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
5680: 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65  r hand if.** the
5690: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
56a0: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
56b0: 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20  ed, i.e.:.**.** 
56c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79  CREATE TABLE yyy
56d0: 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  (...);.**.** The
56e0: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
56f0: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
5700: 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a  me2 is ""..**.**
5710: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
5720: 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c  ts the *ppUnqual
5730: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
5740: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
5750: 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61  pName1 or.** pNa
5760: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5770: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5780: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
5790: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
57a0: 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22  * database "xxx"
57b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
57c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50  .int sqlite3TwoP
57d0: 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  artName(.  Parse
57e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
57f0: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
5800: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
5810: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
5820: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f   *pName1,      /
5830: 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74  * The "xxx" in t
5840: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
5850: 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20  " or "xxx" */.  
5860: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
5870: 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22      /* The "yyy"
5880: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
5890: 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65  x.yyy" */.  Toke
58a0: 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20  n **pUnqual     
58b0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71  /* Write the unq
58c0: 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20  ualified object 
58d0: 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  name here */.){.
58e0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5900: 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
5910: 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  g the object */.
5920: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5930: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
5940: 66 28 20 41 4c 57 41 59 53 28 70 4e 61 6d 65 32  f( ALWAYS(pName2
5950: 21 3d 30 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e  !=0) && pName2->
5960: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
5970: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
5980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
5990: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
59a0: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
59b0: 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
59c0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
59d0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
59e0: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
59f0: 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20  pName2;.    iDb 
5a00: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  = sqlite3FindDb(
5a10: 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
5a20: 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
5a30: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5a40: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
5a50: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54  nown database %T
5a60: 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  ", pName1);.    
5a70: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
5a80: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
5a90: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
5aa0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
5ab0: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c  ->init.iDb==0 ||
5ac0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
5ad0: 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e  ;.    iDb = db->
5ae0: 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70  init.iDb;.    *p
5af0: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b  Unqual = pName1;
5b00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44  .  }.  return iD
5b10: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  b;.}../*.** This
5b20: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
5b30: 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
5b40: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e   UTF-8 string zN
5b50: 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a  ame is a legal.*
5b60: 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * unqualified na
5b70: 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68  me for a new sch
5b80: 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c  ema object (tabl
5b90: 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f  e, index, view o
5ba0: 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41  r.** trigger). A
5bb0: 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67  ll names are leg
5bc0: 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20  al except those 
5bd0: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
5be0: 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73  the string.** "s
5bf0: 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65  qlite_" (in uppe
5c00: 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65  r, lower or mixe
5c10: 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f  d case). This po
5c20: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d  rtion of the nam
5c30: 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73  espace.** is res
5c40: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
5c50: 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  al use..*/.int s
5c60: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
5c70: 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61  tName(Parse *pPa
5c80: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
5c90: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21  *zName){.  if( !
5ca0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
5cb0: 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d  .busy && pParse-
5cc0: 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20  >nested==0 .    
5cd0: 20 20 20 20 20 20 26 26 20 28 70 50 61 72 73 65        && (pParse
5ce0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
5cf0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
5d00: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )==0.          &
5d10: 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e  & 0==sqlite3StrN
5d20: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  ICmp(zName, "sql
5d30: 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20  ite_", 7) ){.   
5d40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5d50: 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74  (pParse, "object
5d60: 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66   name reserved f
5d70: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a  or internal use:
5d80: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
5d90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5da0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
5db0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5dc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5dd0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
5de0: 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65 0a  ndex of a table.
5df0: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
5e00: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
5e10: 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20  (Table *pTab){. 
5e20: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72   Index *p;.  for
5e30: 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  (p=pTab->pIndex;
5e40: 20 70 20 26 26 20 70 2d 3e 61 75 74 6f 49 6e 64   p && p->autoInd
5e50: 65 78 21 3d 32 3b 20 70 3d 70 2d 3e 70 4e 65 78  ex!=2; p=p->pNex
5e60: 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  t){}.  return p;
5e70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5e80: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69   the column of i
5e90: 6e 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63  ndex pIdx that c
5ea0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61  orresponds to ta
5eb0: 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43  ble.** column iC
5ec0: 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  ol.  Return -1 i
5ed0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
5ee0: 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  i16 sqlite3Colum
5ef0: 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  nOfIndex(Index *
5f00: 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b  pIdx, i16 iCol){
5f10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5f20: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
5f30: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
5f40: 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
5f50: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65  aiColumn[i] ) re
5f60: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
5f70: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
5f80: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
5f90: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
5fa0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
5fb0: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
5fc0: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
5fd0: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
5fe0: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
5ff0: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
6000: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
6010: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6020: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
6030: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
6040: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
6050: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
6060: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
6070: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
6080: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
6090: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
60a0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
60b0: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
60c0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
60d0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
60e0: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
60f0: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
6100: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
6110: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
6120: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
6130: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
6140: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
6150: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
6160: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
6170: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
6180: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
6190: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
61a0: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
61b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
61c0: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
61d0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
61e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
61f0: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
6200: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
6210: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
6220: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
6230: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
6240: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
6250: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
6260: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
6270: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
6280: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
6290: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
62a0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
62b0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
62c0: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
62d0: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
62e0: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
62f0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
6300: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
6310: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6320: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
6330: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
6340: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
6350: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
6360: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
6370: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
6380: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
6390: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
63a0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
63b0: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
63c0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
63d0: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
63e0: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
63f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6400: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
6410: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
6420: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6430: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
6440: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
6450: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
6460: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
6470: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
6480: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
6490: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
64a0: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
64b0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
64c0: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
64d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
64e0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
64f0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
6500: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
6510: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
6520: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
6530: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6540: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
6550: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
6560: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
6570: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62  */..  /* The tab
6580: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
6590: 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73  to create is pas
65a0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
65b0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20  ine via tokens. 
65c0: 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70   ** pName1 and p
65d0: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
65e0: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
65f0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
6600: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
6610: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
6620: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
6630: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e  .  ** .  ** Then
6640: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
6650: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
6660: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
6670: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20   other hand if. 
6680: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61   ** the table na
6690: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
66a0: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
66b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
66c0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
66d0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ;.  **.  ** Then
66e0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
66f0: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
6700: 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20  e2 is ""..  **. 
6710: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c   ** The call bel
6720: 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d  ow sets the pNam
6730: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  e pointer to poi
6740: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
6750: 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20  (pName1 or.  ** 
6760: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
6770: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
6780: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
6790: 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62  The variable iDb
67a0: 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20   is.  ** set to 
67b0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
67c0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74   database that t
67d0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
67e0: 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63   is to be.  ** c
67f0: 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a  reated in..  */.
6800: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
6810: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
6820: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
6830: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
6840: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
6850: 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  ;.  if( !OMIT_TE
6860: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26  MPDB && isTemp &
6870: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26  & pName2->n>0 &&
6880: 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 2f   iDb!=1 ){.    /
6890: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
68a0: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
68b0: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
68c0: 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73  qualified. Unles
68d0: 73 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  s .    ** the da
68e0: 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22  tabase name is "
68f0: 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a  temp" anyway.  *
6900: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
6910: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
6920: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
6930: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
6940: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72  alified");.    r
6950: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
6960: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6970: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
6980: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
6990: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
69a0: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
69b0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
69c0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
69d0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
69e0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c  eturn;.  if( SQL
69f0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
6a00: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
6a10: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
6a20: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
6a30: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
6a40: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
6a50: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
6a60: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
6a70: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
6a80: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
6a90: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
6aa0: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
6ab0: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
6ac0: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
6ad0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
6ae0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
6af0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
6b00: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
6b10: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
6b20: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
6b30: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
6b40: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6b50: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
6b60: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
6b70: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
6b80: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
6b90: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
6ba0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
6bb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6bc0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
6bd0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
6be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6bf0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
6c00: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
6c10: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
6c20: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
6c30: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
6c40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6c50: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
6c60: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
6c70: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
6c80: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74  .    if( !isVirt
6c90: 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75  ual && sqlite3Au
6ca0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
6cb0: 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  code, zName, 0, 
6cc0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
6cd0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6ce0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
6cf0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
6d00: 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74  e sure the new t
6d10: 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e  able name does n
6d20: 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ot collide with 
6d30: 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
6d40: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
6d50: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65  name in the same
6d60: 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75   database.  Issu
6d70: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
6d80: 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f  ge if.  ** it do
6d90: 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  es. The exceptio
6da0: 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74  n is if the stat
6db0: 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73  ement being pars
6dc0: 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20  ed was passed.  
6dd0: 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ** to an sqlite3
6de0: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20  _declare_vtab() 
6df0: 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61  call. In that ca
6e00: 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  se only the colu
6e10: 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e  mn names.  ** an
6e20: 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20  d types will be 
6e30: 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69  used, so there i
6e40: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73  s no need to tes
6e50: 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a  t for namespace.
6e60: 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e    ** collisions.
6e70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f  .  */.  if( !IN_
6e80: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a  DECLARE_VTAB ){.
6e90: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
6ea0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
6eb0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  me;.    if( SQLI
6ec0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
6ed0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
6ee0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
6ef0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6f00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
6f10: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
6f20: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
6f30: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
6f40: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
6f50: 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20  f( !noErr ){.   
6f60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
6f70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
6f80: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
6f90: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
6fa0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6fb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
6fc0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
6fd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
6fe0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
6ff0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
7000: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
7010: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7020: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
7030: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
7040: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  x(db, zName, zDb
7050: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
7060: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7070: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
7080: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
7090: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
70a0: 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  e);.      goto b
70b0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
70c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
70d0: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44  Table = sqlite3D
70e0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
70f0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
7100: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
7110: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
7120: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
7130: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
7140: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7150: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
7160: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7170: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
7180: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
7190: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
71a0: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
71b0: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
71c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
71d0: 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c  pSchema;.  pTabl
71e0: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  e->nRef = 1;.  p
71f0: 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 20 3d  Table->nRowEst =
7200: 20 31 30 34 38 35 37 36 3b 0a 20 20 61 73 73 65   1048576;.  asse
7210: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
7220: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50  Table==0 );.  pP
7230: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
7240: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
7250: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
7260: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
7270: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
7280: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
7290: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
72a0: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
72b0: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
72c0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
72d0: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
72e0: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
72f0: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
7300: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
7310: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7320: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
7330: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
7340: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
7350: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
7360: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
7370: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
7380: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
7390: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
73a0: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53  ;.    pTable->pS
73b0: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
73c0: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
73d0: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
73e0: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
73f0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
7400: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
7410: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
7420: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
7430: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
7440: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
7450: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
7460: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
7470: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
7480: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7490: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
74a0: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
74b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
74c0: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
74d0: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
74e0: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
74f0: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
7500: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
7510: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
7520: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
7530: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
7540: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
7550: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
7560: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
7570: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
7580: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
7590: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
75a0: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
75b0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
75c0: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
75d0: 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69     int j1;.    i
75e0: 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20  nt fileFormat;. 
75f0: 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67     int reg1, reg
7600: 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71 6c  2, reg3;.    sql
7610: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
7620: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
7630: 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  0, iDb);..#ifnde
7640: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
7650: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
7660: 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  f( isVirtual ){.
7670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7680: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
7690: 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  egin);.    }.#en
76a0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
76b0: 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61  he file format a
76c0: 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74  nd encoding in t
76d0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65  he database have
76e0: 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a   not been set, .
76f0: 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20      ** set them 
7700: 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  now..    */.    
7710: 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72  reg1 = pParse->r
7720: 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
7730: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
7740: 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g2 = pParse->reg
7750: 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Root = ++pParse-
7760: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20  >nMem;.    reg3 
7770: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
7780: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7790: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65  eAddOp3(v, OP_Re
77a0: 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72  adCookie, iDb, r
77b0: 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f  eg3, BTREE_FILE_
77c0: 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c  FORMAT);.    sql
77d0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
77e0: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6a  e(v, iDb);.    j
77f0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
7800: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
7810: 72 65 67 33 29 3b 0a 20 20 20 20 66 69 6c 65 46  reg3);.    fileF
7820: 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61  ormat = (db->fla
7830: 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61  gs & SQLITE_Lega
7840: 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a  cyFileFmt)!=0 ?.
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58    1 : SQLITE_MAX
7870: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20  _FILE_FORMAT;.  
7880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7890: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
78a0: 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 72  r, fileFormat, r
78b0: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
78c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
78d0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
78e0: 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52  , BTREE_FILE_FOR
78f0: 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  MAT, reg3);.    
7900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7910: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
7920: 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29 3b   ENC(db), reg3);
7930: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7940: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
7950: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
7960: 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47  EE_TEXT_ENCODING
7970: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
7980: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
7990: 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a  (v, j1);..    /*
79a0: 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74   This just creat
79b0: 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65  es a place-holde
79c0: 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  r record in the 
79d0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
79e0: 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ble..    ** The 
79f0: 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64  record created d
7a00: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
7a10: 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49  anything yet.  I
7a20: 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63  t will be replac
7a30: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
7a40: 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63   real entry in c
7a50: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74  ode generated at
7a60: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
7a70: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
7a80: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
7a90: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
7aa0: 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
7ab0: 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77  r pParse->regRow
7ac0: 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  id..    ** The r
7ad0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
7ae0: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
7af0: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20   is left in reg 
7b00: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e  pParse->regRoot.
7b10: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
7b20: 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  d and root page 
7b30: 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72  number values ar
7b40: 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20  e needed by the 
7b50: 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  code that.    **
7b60: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
7b70: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a   will generate..
7b80: 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69      */.#if !defi
7b90: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7ba0: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
7bb0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
7bc0: 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
7bd0: 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73  if( isView || is
7be0: 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20  Virtual ){.     
7bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7c00: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
7c10: 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20  , 0, reg2);.    
7c20: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
7c30: 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d   {.      pParse-
7c40: 3e 61 64 64 72 43 72 54 61 62 20 3d 20 73 71 6c  >addrCrTab = sql
7c50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7c60: 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  , OP_CreateTable
7c70: 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20  , iDb, reg2);.  
7c80: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
7c90: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70  penMasterTable(p
7ca0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
7cb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7cc0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
7cd0: 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20  d, 0, reg1);.   
7ce0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7cf0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
7d00: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
7d10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7d20: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20  , OP_Insert, 0, 
7d30: 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20  reg3, reg1);.   
7d40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7d50: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
7d60: 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69  PPEND);.    sqli
7d70: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
7d80: 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a   OP_Close);.  }.
7d90: 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f  .  /* Normal (no
7da0: 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e  n-error) return.
7db0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20   */.  return;.. 
7dc0: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
7dd0: 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20  occurs, we jump 
7de0: 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61  here */.begin_ta
7df0: 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c  ble_error:.  sql
7e00: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
7e10: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
7e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  .}../*.** This m
7e30: 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
7e40: 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69  compare two stri
7e50: 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e  ngs in a case-in
7e60: 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72  sensitive manner
7e70: 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68  ..** It is sligh
7e80: 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20  tly faster than 
7e90: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53  calling sqlite3S
7ea0: 74 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c  trICmp() directl
7eb0: 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63  y, but.** produc
7ec0: 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a  es larger code..
7ed0: 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  **.** WARNING: T
7ee0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74  his macro is not
7ef0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
7f00: 20 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61   the strcmp() fa
7f10: 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75  mily. It.** retu
7f20: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
7f30: 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20  two strings are 
7f40: 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65  equal, otherwise
7f50: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69   false..*/.#defi
7f60: 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29  ne STRICMP(x, y)
7f70: 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72   (\.sqlite3Upper
7f80: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
7f90: 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d  ed char *)(x)]==
7fa0: 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65     \.sqlite3Uppe
7fb0: 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67  rToLower[*(unsig
7fc0: 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20  ned char *)(y)] 
7fd0: 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33      \.&& sqlite3
7fe0: 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79  StrICmp((x)+1,(y
7ff0: 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a  )+1)==0 )../*.**
8000: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
8010: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
8020: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
8030: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
8040: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
8050: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
8060: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
8070: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
8080: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
8090: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
80a0: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
80b0: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
80c0: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
80d0: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
80e0: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
80f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
8100: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
8110: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8120: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
8130: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
8140: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
8150: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
8160: 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  har *z;.  Column
8170: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
8180: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8190: 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  db;.  if( (p = p
81a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
81b0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  )==0 ) return;.#
81c0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
81d0: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43  LUMN.  if( p->nC
81e0: 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ol+1>db->aLimit[
81f0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
8200: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
8210: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8220: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
8230: 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d  lumns on %s", p-
8240: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
8250: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
8260: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
8270: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
8280: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
8290: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
82a0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
82b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
82c0: 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43  STRICMP(z, p->aC
82d0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a  ol[i].zName) ){.
82e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
82f0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
8300: 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20  uplicate column 
8310: 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  name: %s", z);. 
8320: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8330: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
8340: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8350: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
8360: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
8370: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
8380: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
8390: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
83a0: 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c  p->aCol,(p->nCol
83b0: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
83c0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
83d0: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
83e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
83f0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
8400: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
8410: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
8420: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
8430: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
8440: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
8450: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
8460: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
8470: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
8480: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
8490: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
84a0: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
84b0: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
84c0: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
84d0: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
84e0: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
84f0: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
8500: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
8510: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
8520: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
8530: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
8540: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
8550: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
8560: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43  E_AFF_NONE;.  pC
8570: 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20  ol->szEst = 1;. 
8580: 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f   p->nCol++;.}../
8590: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
85a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
85b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
85c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
85d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
85e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
85f0: 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55  ment.  A "NOT NU
8600: 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  LL" constraint h
8610: 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20  as.** been seen 
8620: 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  on a column.  Th
8630: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
8640: 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67  the notNull flag
8650: 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   on.** the colum
8660: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
8670: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
8680: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8690: 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20  ddNotNull(Parse 
86a0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45  *pParse, int onE
86b0: 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  rror){.  Table *
86c0: 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  p;.  p = pParse-
86d0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
86e0: 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
86f0: 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74  p->nCol<1) ) ret
8700: 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70  urn;.  p->aCol[p
8710: 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c  ->nCol-1].notNul
8720: 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  l = (u8)onError;
8730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  .}../*.** Scan t
8740: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e  he column type n
8750: 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74  ame zType (lengt
8760: 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74  h nType) and ret
8770: 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63  urn the.** assoc
8780: 69 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74  iated affinity t
8790: 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ype..**.** This 
87a0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63  routine does a c
87b0: 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20  ase-independent 
87c0: 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20  search of zType 
87d0: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73  for the .** subs
87e0: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f  trings in the fo
87f0: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49  llowing table. I
8800: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  f one of the sub
8810: 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f  strings is.** fo
8820: 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70  und, the corresp
8830: 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20  onding affinity 
8840: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
8850: 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  zType contains.*
8860: 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
8870: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
8880: 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72  s, entries towar
8890: 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a  d the top of .**
88a0: 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20   the table take 
88b0: 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78  priority. For ex
88c0: 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20  ample, if zType 
88d0: 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a  is 'BLOBINT', .*
88e0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
88f0: 45 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64  EGER is returned
8900: 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e  ..**.** Substrin
8910: 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79  g     | Affinity
8920: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
8930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8940: 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20  ----.** 'INT'   
8950: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8960: 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43  FF_INTEGER.** 'C
8970: 48 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51  HAR'        | SQ
8980: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
8990: 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'CLOB'        |
89a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
89b0: 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20  .** 'TEXT'      
89c0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
89d0: 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20  EXT.** 'BLOB'   
89e0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
89f0: 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27  F_NONE.** 'REAL'
8a00: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8a10: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c  _AFF_REAL.** 'FL
8a20: 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OA'        | SQL
8a30: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
8a40: 27 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20  'DOUB'        | 
8a50: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
8a60: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  **.** If none of
8a70: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
8a80: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62  in the above tab
8a90: 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a  le are found,.**
8aa0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
8ab0: 52 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e  RIC is returned.
8ac0: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
8ad0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e  AffinityType(con
8ae0: 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 75 38  st char *zIn, u8
8af0: 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20 75 33 32   *pszEst){.  u32
8b00: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
8b10: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8b20: 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74  NUMERIC;.  const
8b30: 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30   char *zChar = 0
8b40: 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20  ;..  if( zIn==0 
8b50: 29 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 20 20  ) return aff;.  
8b60: 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b  while( zIn[0] ){
8b70: 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20  .    h = (h<<8) 
8b80: 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  + sqlite3UpperTo
8b90: 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66  Lower[(*zIn)&0xf
8ba0: 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  f];.    zIn++;. 
8bb0: 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c     if( h==(('c'<
8bc0: 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28  <24)+('h'<<16)+(
8bd0: 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20  'a'<<8)+'r') ){ 
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8bf0: 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  HAR */.      aff
8c00: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
8c10: 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20  XT;.      zChar 
8c20: 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  = zIn;.    }else
8c30: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
8c40: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
8c50: 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20  '<<8)+'b') ){   
8c60: 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20      /* CLOB */. 
8c70: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8c80: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
8c90: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8ca0: 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  t'<<24)+('e'<<16
8cb0: 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20  )+('x'<<8)+'t') 
8cc0: 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54  ){       /* TEXT
8cd0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
8ce0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
8cf0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
8d00: 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c  ==(('b'<<24)+('l
8d10: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
8d20: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
8d30: 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20   BLOB */.       
8d40: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
8d50: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20  _AFF_NUMERIC || 
8d60: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8d70: 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61  REAL) ){.      a
8d80: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8d90: 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 69 66 28 20  NONE;.      if( 
8da0: 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43  zIn[0]=='(' ) zC
8db0: 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64  har = zIn;.#ifnd
8dc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
8dd0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
8de0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8df0: 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('r'<<24)+('e'<<
8e00: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27  16)+('a'<<8)+'l'
8e10: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45  )          /* RE
8e20: 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  AL */.        &&
8e30: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
8e40: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
8e50: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8e60: 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c  FF_REAL;.    }el
8e70: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c  se if( h==(('f'<
8e80: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
8e90: 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20  'o'<<8)+'a')    
8ea0: 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f        /* FLOA */
8eb0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
8ec0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8ed0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
8ee0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
8ef0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
8f00: 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b  ( h==(('d'<<24)+
8f10: 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c  ('o'<<16)+('u'<<
8f20: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
8f30: 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20   /* DOUB */.    
8f40: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8f50: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
8f60: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8f70: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23  LITE_AFF_REAL;.#
8f80: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20  endif.    }else 
8f90: 69 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46  if( (h&0x00FFFFF
8fa0: 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28  F)==(('i'<<16)+(
8fb0: 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20  'n'<<8)+'t') ){ 
8fc0: 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20     /* INT */.   
8fd0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8fe0: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
8ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9000: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73 7a    }..  /* If psz
9010: 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  Est is not NULL,
9020: 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69 6d 61   store an estima
9030: 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20  te of the field 
9040: 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20  size.  The.  ** 
9050: 65 73 74 69 6d 61 74 65 20 69 73 20 73 63 61 6c  estimate is scal
9060: 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  ed so that the s
9070: 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  ize of an intege
9080: 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66  r is 1.  */.  if
9090: 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20 20 20  ( pszEst ){.    
90a0: 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20 20 2f  *pszEst = 1;   /
90b0: 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69  * default size i
90c0: 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65 73  s approx 4 bytes
90d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c   */.    if( aff<
90e0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
90f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43   ){.      if( zC
9100: 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77  har ){.        w
9110: 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29  hile( zChar[0] )
9120: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9130: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
9140: 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20  Char[0]) ){.    
9150: 20 20 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20          int v = 
9160: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  0;.            s
9170: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
9180: 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  Char, &v);.     
9190: 20 20 20 20 20 20 20 76 20 3d 20 76 2f 34 20 2b         v = v/4 +
91a0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
91b0: 69 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20  if( v>255 ) v = 
91c0: 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20  255;.           
91d0: 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a   *pszEst = v; /*
91e0: 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41   BLOB(k), VARCHA
91f0: 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e  R(k), CHAR(k) ->
9200: 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20   r=(k/4+1) */.  
9210: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9220: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9230: 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a         zChar++;.
9240: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9250: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
9260: 70 73 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a  pszEst = 5;   /*
9270: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
9280: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
9290: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
92a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
92b0: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
92c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
92d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
92e0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
92f0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
9300: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9310: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9320: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
9330: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
9340: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
9350: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
9360: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
9370: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
9380: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
9390: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
93a0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
93b0: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
93c0: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
93d0: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
93e0: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
93f0: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
9400: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
9410: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
9420: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
9430: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
9440: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
9450: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
9460: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
9470: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
9480: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  arse, Token *pTy
9490: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
94a0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
94b0: 0a 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ..  p = pParse->
94c0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
94d0: 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70   p==0 || NEVER(p
94e0: 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75  ->nCol<1) ) retu
94f0: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
9500: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
9510: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c  ;.  assert( pCol
9520: 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ->zType==0 );.  
9530: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
9540: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
9550: 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
9560: 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61  Type);.  pCol->a
9570: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
9580: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 43  3AffinityType(pC
9590: 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26 70 43 6f 6c  ol->zType, &pCol
95a0: 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  ->szEst);.}../*.
95b0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
95c0: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
95d0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
95e0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
95f0: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
9600: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
9610: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
9620: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
9630: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
9640: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
9650: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
9660: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
9670: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
9680: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
9690: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
96a0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
96b0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
96c0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
96d0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
96e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
96f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9700: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
9710: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
9720: 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b  xprSpan *pSpan){
9730: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
9740: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
9750: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9760: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70  rse->db;.  p = p
9770: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9780: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
9790: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
97a0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
97b0: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
97c0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
97d0: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e  OrFunction(pSpan
97e0: 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->pExpr) ){.    
97f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9800: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
9810: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
9820: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
9830: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
9840: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
9850: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9860: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
9870: 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e  pExpr is used in
9880: 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69  stead of the ori
9890: 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20  ginal, as pExpr 
98a0: 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
98b0: 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f  * tokens that po
98c0: 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20  int to volatile 
98d0: 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70 61  memory. The 'spa
98e0: 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  n' of the expres
98f0: 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  sion.      ** is
9900: 20 72 65 71 75 69 72 65 64 20 62 79 20 70 72 61   required by pra
9910: 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a  gma table_info..
9920: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
9930: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9940: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
9950: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  );.      pCol->p
9960: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Dflt = sqlite3Ex
9970: 70 72 44 75 70 28 64 62 2c 20 70 53 70 61 6e 2d  prDup(db, pSpan-
9980: 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55 50 5f  >pExpr, EXPRDUP_
9990: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73  REDUCE);.      s
99a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
99b0: 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20   pCol->zDflt);. 
99c0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74       pCol->zDflt
99d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
99e0: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
99f0: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20  Span->zStart,.  
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
9a30: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
9a40: 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  tart));.    }.  
9a50: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
9a60: 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d  elete(db, pSpan-
9a70: 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pExpr);.}../*.*
9a80: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
9a90: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
9aa0: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
9ab0: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
9ac0: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
9ad0: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
9ae0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
9af0: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
9b00: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
9b10: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
9b20: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
9b30: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
9b40: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
9b50: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
9b60: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
9b70: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
9b80: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
9b90: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
9ba0: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
9bb0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
9bc0: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
9bd0: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
9be0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
9bf0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
9c00: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
9c10: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
9c20: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
9c30: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
9c40: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
9c50: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64  umn as the rowid
9c60: 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  .  Set the Table
9c70: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
9c80: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
9c90: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
9ca0: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
9cb0: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
9cc0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
9cd0: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
9ce0: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
9cf0: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
9d00: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
9d10: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
9d20: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
9d30: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
9d40: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
9d50: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
9d60: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
9d70: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
9d80: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
9d90: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
9da0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9db0: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  AddPrimaryKey(. 
9dc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9dd0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9de0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
9df0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20  ist *pList,  /* 
9e00: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61  List of field na
9e10: 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mes to be indexe
9e20: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
9e30: 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74  or,      /* What
9e40: 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e   to do with a un
9e50: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
9e60: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49  t */.  int autoI
9e70: 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  nc,      /* True
9e80: 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52   if the AUTOINCR
9e90: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73  EMENT keyword is
9ea0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
9eb0: 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20  t sortOrder     
9ec0: 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  /* SQLITE_SO_ASC
9ed0: 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45   or SQLITE_SO_DE
9ee0: 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  SC */.){.  Table
9ef0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
9f00: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68  >pNewTable;.  ch
9f10: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
9f20: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20   int iCol = -1, 
9f30: 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  i;.  int nTerm;.
9f40: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
9f50: 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
9f60: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
9f70: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
9f80: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
9f90: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
9fa0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
9fb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9fc0: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
9fd0: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
9fe0: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
9ff0: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
a000: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
a010: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
a020: 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c   }.  pTab->tabFl
a030: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69  ags |= TF_HasPri
a040: 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70  maryKey;.  if( p
a050: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
a060: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
a070: 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   - 1;.    pTab->
a080: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c  aCol[iCol].colFl
a090: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50  ags |= COLFLAG_P
a0a0: 52 49 4d 4b 45 59 3b 0a 20 20 20 20 7a 54 79 70  RIMKEY;.    zTyp
a0b0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
a0c0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
a0d0: 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c  nTerm = 1;.  }el
a0e0: 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  se{.    nTerm = 
a0f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
a100: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65    for(i=0; i<nTe
a110: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
a120: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
a130: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
a140: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  l++){.        if
a150: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
a160: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
a170: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
a180: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
a190: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
a1a0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c  ->aCol[iCol].col
a1b0: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
a1c0: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20  _PRIMKEY;.      
a1d0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
a1e0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
a1f0: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  pe;.          br
a200: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a210: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a220: 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a  .  if( nTerm==1.
a230: 20 20 20 26 26 20 7a 54 79 70 65 20 26 26 20 73     && zType && s
a240: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
a250: 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ype, "INTEGER")=
a260: 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72 64  =0.   && sortOrd
a270: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
a280: 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  C.  ){.    pTab-
a290: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
a2a0: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
a2b0: 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
a2c0: 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f      assert( auto
a2d0: 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e  Inc==0 || autoIn
a2e0: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62  c==1 );.    pTab
a2f0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75  ->tabFlags |= au
a300: 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63  toInc*TF_Autoinc
a310: 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20  rement;.    if( 
a320: 70 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e  pList ) pParse->
a330: 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  iPkSortOrder = p
a340: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
a350: 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rder;.  }else if
a360: 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66  ( autoInc ){.#if
a370: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a380: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
a390: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a3a0: 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f  sg(pParse, "AUTO
a3b0: 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c  INCREMENT is onl
a3c0: 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20  y allowed on an 
a3d0: 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45  ".       "INTEGE
a3e0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b  R PRIMARY KEY");
a3f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
a400: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
a410: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a420: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
a430: 69 66 28 20 76 20 29 20 70 50 61 72 73 65 2d 3e  if( v ) pParse->
a440: 61 64 64 72 53 6b 69 70 50 4b 20 3d 20 73 71 6c  addrSkipPK = sql
a450: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
a460: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
a470: 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  p = sqlite3Creat
a480: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
a490: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
a4a0: 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20  nError, 0,.     
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4c0: 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64        0, sortOrd
a4d0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
a4e0: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75  p ){.      p->au
a4f0: 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20  toIndex = 2;.   
a500: 20 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74     if( v ) sqlit
a510: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a520: 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b  , pParse->addrSk
a530: 69 70 50 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ipPK);.    }.   
a540: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a   pList = 0;.  }.
a550: 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69  .primary_key_exi
a560: 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  t:.  sqlite3Expr
a570: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
a580: 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  e->db, pList);. 
a590: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
a5a0: 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43  * Add a new CHEC
a5b0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  K constraint to 
a5c0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
a5d0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
a5e0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
a5f0: 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43  sqlite3AddCheckC
a600: 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
a610: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
a620: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a630: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68  t */.  Expr *pCh
a640: 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20  eckExpr  /* The 
a650: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
a660: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
a670: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
a680: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
a690: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
a6a0: 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26  le;.  if( pTab &
a6b0: 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  & !IN_DECLARE_VT
a6c0: 41 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  AB ){.    pTab->
a6d0: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
a6e0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
a6f0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68  Parse, pTab->pCh
a700: 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29  eck, pCheckExpr)
a710: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
a720: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
a730: 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  .n ){.      sqli
a740: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
a750: 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  me(pParse, pTab-
a760: 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65  >pCheck, &pParse
a770: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
a780: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 1);.    }.  }e
a790: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
a7a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
a7b0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
a7c0: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
a7d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
a7e0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
a7f0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
a800: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
a810: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
a820: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
a830: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
a840: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
a850: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
a860: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
a870: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
a880: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
a890: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
a8a0: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
a8b0: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
a8c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
a8d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
a8e0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
a8f0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
a900: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
a910: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62   p->nCol-1;.  db
a920: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
a930: 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
a940: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
a950: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
a960: 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
a970: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
a980: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
a990: 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
a9a0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
a9b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
a9c0: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69  ee(db, p->aCol[i
a9d0: 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d  ].zColl);.    p-
a9e0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d  >aCol[i].zColl =
a9f0: 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f   zColl;.  .    /
aa00: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
aa10: 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22  is declared as "
aa20: 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b  <name> PRIMARY K
aa30: 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65  EY COLLATE <type
aa40: 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  >",.    ** then 
aa50: 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76  an index may hav
aa60: 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  e been created o
aa70: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65  n this column be
aa80: 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
aa90: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
aaa0: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
aab0: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
aac0: 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  the case..    */
aad0: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
aae0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
aaf0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
ab00: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ab10: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
ab20: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
ab30: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
ab40: 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =i ){.        pI
ab50: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20  dx->azColl[0] = 
ab60: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
ab70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ab80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
ab90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
aba0: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Coll);.  }.}../*
abb0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
abc0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  n returns the co
abd0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
abe0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61   for database na
abf0: 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63  tive text.** enc
ac00: 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64  oding identified
ac10: 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a   by the string z
ac20: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
ac30: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  me..**.** If the
ac40: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
ac50: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
ac60: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
ac70: 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  or not available
ac80: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
ac90: 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64  ase native encod
aca0: 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69  ing, the collati
acb0: 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e  on factory is in
acc0: 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75  voked to.** requ
acd0: 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63  est it. If the c
ace0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
acf0: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79   does not supply
ad00: 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65   such a sequence
ad10: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71  ,.** and the seq
ad20: 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62  uence is availab
ad30: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65  le in another te
ad40: 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  xt encoding, the
ad50: 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74  n that is.** ret
ad60: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
ad70: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69  *.** If no versi
ad80: 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65  ons of the reque
ad90: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20  sted collations 
ada0: 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61  sequence are ava
adb0: 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e  ilable, or.** an
adc0: 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75  other error occu
add0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
ade0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
adf0: 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65  r message writte
ae00: 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65  n into.** pParse
ae10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ae20: 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65  tine is a wrappe
ae30: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
ae40: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20  FindCollSeq().  
ae50: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
ae60: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c  invokes the coll
ae70: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66  ation factory if
ae80: 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61   the named colla
ae90: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66  tion cannot be f
aea0: 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  ound.** and gene
aeb0: 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rates an error m
aec0: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  essage..**.** Se
aed0: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46  e also: sqlite3F
aee0: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71  indCollSeq(), sq
aef0: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
af00: 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ).*/.CollSeq *sq
af10: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
af20: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
af30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
af40: 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ame){.  sqlite3 
af50: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
af60: 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43  ;.  u8 enc = ENC
af70: 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62  (db);.  u8 initb
af80: 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62  usy = db->init.b
af90: 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  usy;.  CollSeq *
afa0: 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20  pColl;..  pColl 
afb0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
afc0: 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e  lSeq(db, enc, zN
afd0: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
afe0: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
aff0: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
b000: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
b010: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
b020: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61  e3GetCollSeq(pPa
b030: 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c  rse, enc, pColl,
b040: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20   zName);.  }..  
b050: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
b060: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
b070: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
b080: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  increment the sc
b090: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a  hema cookie..**.
b0a0: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
b0b0: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
b0c0: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
b0d0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
b0e0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
b0f0: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
b100: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
b110: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
b120: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
b130: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
b140: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
b150: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
b160: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
b170: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
b180: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
b190: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
b1a0: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
b1b0: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
b1c0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
b1d0: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
b1e0: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
b1f0: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
b200: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
b210: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
b220: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
b230: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
b240: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
b250: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
b260: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
b270: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
b280: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
b290: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
b2a0: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
b2b0: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
b2c0: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
b2d0: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
b2e0: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
b2f0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
b300: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
b310: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
b320: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
b330: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
b340: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73  hangeCookie(Pars
b350: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
b360: 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  Db){.  int r1 = 
b370: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
b380: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
b390: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b3a0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
b3b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
b3c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b3d0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
b3e0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
b3f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
b400: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
b410: 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ger, db->aDb[iDb
b420: 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
b430: 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b  a_cookie+1, r1);
b440: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
b450: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
b460: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
b470: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c  _SCHEMA_VERSION,
b480: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
b490: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
b4a0: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
b4b0: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
b4c0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
b4d0: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
b4e0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
b4f0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
b500: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
b510: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
b520: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
b530: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
b540: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
b550: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
b560: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
b570: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
b580: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
b590: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
b5a0: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
b5b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
b5c0: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
b5d0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
b5e0: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
b5f0: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
b600: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
b610: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
b620: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
b630: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
b640: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
b650: 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70  inter to an outp
b660: 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73  ut buffer. The s
b670: 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65  econd .** parame
b680: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
b690: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74   to an integer t
b6a0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
b6b0: 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68   offset at.** wh
b6c0: 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74  ich to write int
b6d0: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
b6e0: 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  fer. This functi
b6f0: 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a  on copies the.**
b700: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
b710: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74  string pointed t
b720: 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70  o by the third p
b730: 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65  arameter, zSigne
b740: 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68  dIdent,.** to th
b750: 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73  e specified offs
b760: 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  et in the buffer
b770: 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49   and updates *pI
b780: 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74  dx to refer.** t
b790: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
b7a0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
b7b0: 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66  byte written bef
b7c0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
b7d0: 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72  * .** If the str
b7e0: 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  ing zSignedIdent
b7f0: 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
b800: 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65  ly of alpha-nume
b810: 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ric.** character
b820: 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  s, does not begi
b830: 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61  n with a digit a
b840: 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c  nd is not an SQL
b850: 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65   keyword,.** the
b860: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  n it is copied t
b870: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
b880: 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69  fer exactly as i
b890: 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  t is. Otherwise,
b8a0: 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64  .** it is quoted
b8b0: 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75   using double-qu
b8c0: 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  otes..*/.static 
b8d0: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
b8e0: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
b8f0: 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49  , char *zSignedI
b900: 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  dent){.  unsigne
b910: 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d  d char *zIdent =
b920: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
b930: 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20  )zSignedIdent;. 
b940: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
b950: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
b960: 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  x;..  for(j=0; z
b970: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
b980: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
b990: 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a  Isalnum(zIdent[j
b9a0: 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21  ]) && zIdent[j]!
b9b0: 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='_' ) break;.  
b9c0: 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  }.  needQuote = 
b9d0: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
b9e0: 49 64 65 6e 74 5b 30 5d 29 20 7c 7c 20 73 71 6c  Ident[0]) || sql
b9f0: 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
ba00: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
ba10: 44 3b 0a 20 20 69 66 28 20 21 6e 65 65 64 51 75  D;.  if( !needQu
ba20: 6f 74 65 20 29 7b 0a 20 20 20 20 6e 65 65 64 51  ote ){.    needQ
ba30: 75 6f 74 65 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  uote = zIdent[j]
ba40: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 65 65  ;.  }..  if( nee
ba50: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
ba60: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
ba70: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
ba80: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
ba90: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
baa0: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
bab0: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
bac0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
bad0: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
bae0: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
baf0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
bb00: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
bb10: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
bb20: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
bb30: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
bb40: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
bb50: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
bb60: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
bb70: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
bb80: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
bb90: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
bba0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
bbb0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
bbc0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
bbd0: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
bbe0: 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  eStmt(sqlite3 *d
bbf0: 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  b, Table *p){.  
bc00: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
bc10: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
bc20: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
bc30: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d  , *zEnd;.  Colum
bc40: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
bc50: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
bc60: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
bc70: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
bc80: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
bc90: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
bca0: 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d  >zName) + 5;.  }
bcb0: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
bcc0: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
bcd0: 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20   if( n<50 ){ .  
bce0: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
bcf0: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
bd00: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
bd10: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
bd20: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
bd30: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
bd40: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
bd50: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
bd60: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
bd70: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tmt = sqlite3DbM
bd80: 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a  allocRaw(0, n);.
bd90: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
bda0: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
bdb0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
bdc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
bdd0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
bde0: 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41  (n, zStmt, "CREA
bdf0: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
be00: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
be10: 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  30(zStmt);.  ide
be20: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
be30: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
be40: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
be50: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
be60: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
be70: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
be80: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
be90: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
bea0: 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20  azType[] = {.   
beb0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
bec0: 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20  FF_TEXT    */ " 
bed0: 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f  TEXT",.        /
bee0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
bef0: 45 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  E    */ "",.    
bf00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
bf10: 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e  F_NUMERIC */ " N
bf20: 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  UM",.        /* 
bf30: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
bf40: 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20  ER */ " INT",.  
bf50: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
bf60: 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22  AFF_REAL    */ "
bf70: 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20   REAL".    };.  
bf80: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63    int len;.    c
bf90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
bfa0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ;..    sqlite3_s
bfb0: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
bfc0: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
bfd0: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
bfe0: 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b  trlen30(&zStmt[k
bff0: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
c000: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
c010: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43  ut(zStmt, &k, pC
c020: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
c030: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
c040: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
c050: 46 5f 54 45 58 54 20 3e 3d 20 30 20 29 3b 0a 20  F_TEXT >= 0 );. 
c060: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
c070: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
c080: 5f 41 46 46 5f 54 45 58 54 20 3c 20 41 72 72 61  _AFF_TEXT < Arra
c090: 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b  ySize(azType) );
c0a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c0b0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c0c0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
c0d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c0e0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c0f0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
c100: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c110: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c120: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
c130: 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63  RIC );.    testc
c140: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
c150: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
c160: 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74  INTEGER );.    t
c170: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c180: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c190: 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20  AFF_REAL );.    
c1a0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54  .    zType = azT
c1b0: 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ype[pCol->affini
c1c0: 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty - SQLITE_AFF_
c1d0: 54 45 58 54 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d  TEXT];.    len =
c1e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c1f0: 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73  (zType);.    ass
c200: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
c210: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
c220: 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20 20 20 20  NONE .          
c230: 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e    || pCol->affin
c240: 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69  ity==sqlite3Affi
c250: 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20  nityType(zType, 
c260: 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  0) );.    memcpy
c270: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70  (&zStmt[k], zTyp
c280: 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b  e, len);.    k +
c290: 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  = len;.    asser
c2a0: 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20  t( k<=n );.  }. 
c2b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c2c0: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
c2d0: 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20  , "%s", zEnd);. 
c2e0: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
c2f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61  ../*.** Resize a
c300: 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  n Index object t
c310: 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73  o hold N columns
c320: 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20   total.  Return 
c330: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
c340: 73 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49  success and SQLI
c350: 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f  TE_NOMEM on an O
c360: 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  OM error..*/.sta
c370: 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e  tic int resizeIn
c380: 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  dexObject(sqlite
c390: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  3 *db, Index *pI
c3a0: 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68  dx, int N){.  ch
c3b0: 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e  ar *zExtra;.  in
c3c0: 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70  t nByte;.  if( p
c3d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20  Idx->nColumn>=N 
c3e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c3f0: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  OK;.  assert( pI
c400: 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30  dx->isResized==0
c410: 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73   );.  nByte = (s
c420: 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73  izeof(char*) + s
c430: 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a  izeof(i16) + 1)*
c440: 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71  N;.  zExtra = sq
c450: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
c460: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
c470: 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20  if( zExtra==0 ) 
c480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c490: 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  MEM;.  memcpy(zE
c4a0: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  xtra, pIdx->azCo
c4b0: 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  ll, sizeof(char*
c4c0: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
c4d0: 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
c4e0: 20 3d 20 28 63 68 61 72 2a 2a 29 7a 45 78 74 72   = (char**)zExtr
c4f0: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73  a;.  zExtra += s
c500: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a  izeof(char*)*N;.
c510: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
c520: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c   pIdx->aiColumn,
c530: 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64   sizeof(i16)*pId
c540: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
c550: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  Idx->aiColumn = 
c560: 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20  (i16*)zExtra;.  
c570: 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  zExtra += sizeof
c580: 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70  (i16)*N;.  memcp
c590: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
c5a0: 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78  aSortOrder, pIdx
c5b0: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
c5c0: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  dx->aSortOrder =
c5d0: 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20   (u8*)zExtra;.  
c5e0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  pIdx->nColumn = 
c5f0: 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73  N;.  pIdx->isRes
c600: 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75  ized = 1;.  retu
c610: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c620: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
c630: 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69  the total row wi
c640: 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e  dth for a table.
c650: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c660: 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64  estimateTableWid
c670: 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  th(Table *pTab){
c680: 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62  .  unsigned wTab
c690: 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  le = 0;.  const 
c6a0: 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b  Column *pTabCol;
c6b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
c6c0: 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54  i=pTab->nCol, pT
c6d0: 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c  abCol=pTab->aCol
c6e0: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62  ; i>0; i--, pTab
c6f0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62  Col++){.    wTab
c700: 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73  le += pTabCol->s
c710: 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zEst;.  }.  if( 
c720: 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20  pTab->iPKey<0 ) 
c730: 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62  wTable++;.  pTab
c740: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
c750: 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c  ite3LogEst(wTabl
c760: 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  e*4);.}../*.** E
c770: 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72  stimate the aver
c780: 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f  age size of a ro
c790: 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a  w for an index..
c7a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
c7b0: 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
c7c0: 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  h(Index *pIdx){.
c7d0: 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65    unsigned wInde
c7e0: 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  x = 0;.  int i;.
c7f0: 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
c800: 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61  aCol = pIdx->pTa
c810: 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72  ble->aCol;.  for
c820: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
c830: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
c840: 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61   i16 x = pIdx->a
c850: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
c860: 61 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e  assert( x<pIdx->
c870: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a  pTable->nCol );.
c880: 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c      wIndex += x<
c890: 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64  0 ? 1 : aCol[pId
c8a0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  x->aiColumn[i]].
c8b0: 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64  szEst;.  }.  pId
c8c0: 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71  x->szIdxRow = sq
c8d0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64  lite3LogEst(wInd
c8e0: 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  ex*4);.}../* Ret
c8f0: 75 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75  urn true if valu
c900: 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79  e x is found any
c910: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 43   of the first nC
c920: 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69  ol entries of ai
c930: 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20  Col[].*/.static 
c940: 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f  int hasColumn(co
c950: 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20  nst i16 *aiCol, 
c960: 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29  int nCol, int x)
c970: 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d  {.  while( nCol-
c980: 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a  - > 0 ) if( x==*
c990: 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75  (aiCol++) ) retu
c9a0: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
c9b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
c9c0: 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20  routine runs at 
c9d0: 74 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69  the end of parsi
c9e0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
c9f0: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
ca00: 0a 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55  .** has a WITHOU
ca10: 54 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20  T ROWID clause. 
ca20: 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
ca30: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63   routine is to c
ca40: 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69  onvert both.** i
ca50: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
ca60: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
ca70: 6e 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  nd the generated
ca80: 20 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68   VDBE code so th
ca90: 61 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61  at they.** are a
caa0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61  ppropriate for a
cab0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
cac0: 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  able instead of 
cad0: 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a  a rowid table..*
cae0: 2a 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64  * Changes includ
caf0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
cb00: 20 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50    Convert the OP
cb10: 5f 43 72 65 61 74 65 54 61 62 6c 65 20 69 6e 74  _CreateTable int
cb20: 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e  o an OP_CreateIn
cb30: 64 65 78 2e 20 20 54 68 65 72 65 20 69 73 0a 2a  dex.  There is.*
cb40: 2a 20 20 20 20 20 20 20 20 20 20 6e 6f 20 72 6f  *          no ro
cb50: 77 69 64 20 62 74 72 65 65 20 66 6f 72 20 61 20  wid btree for a 
cb60: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 20 20  WITHOUT ROWID.  
cb70: 49 6e 73 74 65 61 64 2c 20 74 68 65 20 63 61 6e  Instead, the can
cb80: 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20 20  onical.**       
cb90: 20 20 20 64 61 74 61 20 73 74 6f 72 61 67 65 20     data storage 
cba0: 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  is a covering in
cbb0: 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20 20 20  dex btree..**   
cbc0: 20 20 28 32 29 20 20 42 79 70 61 73 73 20 74 68    (2)  Bypass th
cbd0: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  e creation of th
cbe0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
cbf0: 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20  table entry.**  
cc00: 20 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20          for the 
cc10: 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74  PRIMARY KEY as t
cc20: 68 65 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  he the primary k
cc30: 65 79 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a  ey index is now.
cc40: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64 65 6e  **          iden
cc50: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 71  tified by the sq
cc60: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
cc70: 65 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  e entry of the t
cc80: 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20  able itself..** 
cc90: 20 20 20 20 28 33 29 20 20 53 65 74 20 74 68 65      (3)  Set the
cca0: 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74   Index.tnum of t
ccb0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49  he PRIMARY KEY I
ccc0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74  ndex object in t
ccd0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  he.**          s
cce0: 63 68 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f  chema to the roo
ccf0: 74 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d  tpage from the m
cd00: 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  ain table..**   
cd10: 20 20 28 34 29 20 20 53 65 74 20 61 6c 6c 20 63    (4)  Set all c
cd20: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
cd30: 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61  IMARY KEY schema
cd40: 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f   object to be NO
cd50: 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28  T NULL..**     (
cd60: 35 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c  5)  Add all tabl
cd70: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
cd80: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
cd90: 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20  ex object.**    
cda0: 20 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68        so that th
cdb0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
cdc0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
cdd0: 78 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a  x.  The surplus.
cde0: 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  **          colu
cdf0: 6d 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20  mns are part of 
ce00: 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20  KeyInfo.nXField 
ce10: 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64  and are not used
ce20: 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20   for.**         
ce30: 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b   sorting or look
ce40: 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73  up or uniqueness
ce50: 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20   checks..**     
ce60: 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65  (6)  Replace the
ce70: 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61   rowid tail on a
ce80: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
ce90: 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55   generated UNIQU
cea0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e  E.**          in
ceb0: 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50  dices with the P
cec0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
ced0: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
cee0: 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68  id convertToWith
cef0: 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61  outRowidTable(Pa
cf00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
cf10: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
cf20: 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65  ex *pIdx;.  Inde
cf30: 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50  x *pPk;.  int nP
cf40: 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  k;.  int i, j;. 
cf50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
cf60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
cf70: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
cf80: 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76  Vdbe;..  /* Conv
cf90: 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74  ert the OP_Creat
cfa0: 65 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 74 68  eTable opcode th
cfb0: 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  at would normall
cfc0: 79 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 2a  y create the.  *
cfd0: 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f 72 20  * root-page for 
cfe0: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 61  the table into a
cff0: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 20   OP_CreateIndex 
d000: 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 69 6e 64  opcode.  The ind
d010: 65 78 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  ex.  ** created 
d020: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
d030: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
d040: 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  x..  */.  if( pP
d050: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20  arse->addrCrTab 
d060: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  ){.    assert( v
d070: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
d080: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 50 61 72  dbeGetOp(v, pPar
d090: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 29 2d 3e  se->addrCrTab)->
d0a0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 72 65 61  opcode = OP_Crea
d0b0: 74 65 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  teIndex;.  }..  
d0c0: 2f 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72  /* Bypass the cr
d0d0: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52  eation of the PR
d0e0: 49 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20  IMARY KEY btree 
d0f0: 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  and the sqlite_m
d100: 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
d110: 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 69   entry..  */.  i
d120: 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53  f( pParse->addrS
d130: 6b 69 70 50 4b 20 29 7b 0a 20 20 20 20 61 73 73  kipPK ){.    ass
d140: 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71  ert( v );.    sq
d150: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
d160: 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b  , pParse->addrSk
d170: 69 70 50 4b 29 2d 3e 6f 70 63 6f 64 65 20 3d 20  ipPK)->opcode = 
d180: 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 0a 0a 20 20  OP_Goto;.  }..  
d190: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52  /* Locate the PR
d1a0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
d1b0: 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61    Or, if this ta
d1c0: 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ble was original
d1d0: 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47  ly.  ** an INTEG
d1e0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74  ER PRIMARY KEY t
d1f0: 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e  able, create a n
d200: 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ew PRIMARY KEY i
d210: 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ndex. .  */.  if
d220: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
d230: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
d240: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69   *pList;.    pLi
d250: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
d260: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
d270: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  e, 0, 0);.    if
d280: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
d290: 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  urn;.    pList->
d2a0: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[0].zName = sql
d2b0: 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
d2c0: 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
d300: 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
d310: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
d320: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61  .sortOrder = pPa
d330: 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65  rse->iPkSortOrde
d340: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
d350: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
d360: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 70 50  ==pTab );.    pP
d370: 6b 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  k = sqlite3Creat
d380: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
d390: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70  , 0, 0, pList, p
d3a0: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c  Tab->keyConf, 0,
d3b0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
d3c0: 66 28 20 70 50 6b 3d 3d 30 20 29 20 72 65 74 75  f( pPk==0 ) retu
d3d0: 72 6e 3b 0a 20 20 20 20 70 50 6b 2d 3e 61 75 74  rn;.    pPk->aut
d3e0: 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20 20  oIndex = 2;.    
d3f0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
d400: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d410: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
d420: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
d430: 29 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 69 73  );.  }.  pPk->is
d440: 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20  Covering = 1;.  
d450: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
d460: 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e  ;.  nPk = pPk->n
d470: 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61  KeyCol;..  /* Ma
d480: 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 63 6f  ke sure every co
d490: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50 52 49 4d  lumn of the PRIM
d4a0: 41 52 59 20 4b 45 59 20 69 73 20 4e 4f 54 20 4e  ARY KEY is NOT N
d4b0: 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ULL */.  for(i=0
d4c0: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
d4d0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50     pTab->aCol[pP
d4e0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  k->aiColumn[i]].
d4f0: 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d  notNull = 1;.  }
d500: 0a 20 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e  .  pPk->uniqNotN
d510: 75 6c 6c 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54  ull = 1;..  /* T
d520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
d530: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d540: 69 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  is the table roo
d550: 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d  t page */.  pPk-
d560: 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e  >tnum = pTab->tn
d570: 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  um;..  /* Update
d580: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
d590: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
d5a0: 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69   all UNIQUE indi
d5b0: 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e  ces by convertin
d5c0: 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c  g.  ** the final
d5d0: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e   rowid column in
d5e0: 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  to one or more c
d5f0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
d600: 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a  IMARY KEY..  */.
d610: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
d620: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
d630: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
d640: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
d650: 20 69 66 28 20 70 49 64 78 2d 3e 61 75 74 6f 49   if( pIdx->autoI
d660: 6e 64 65 78 3d 3d 32 20 29 20 63 6f 6e 74 69 6e  ndex==2 ) contin
d670: 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d  ue;.    for(i=n=
d680: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
d690: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
d6a0: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
d6b0: 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
d6c0: 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
d6d0: 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20  n[i]) ) n++;.   
d6e0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20   }.    if( n==0 
d6f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
d700: 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70 65   index is a supe
d710: 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d  rset of the prim
d720: 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20  ary key */.     
d730: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
d740: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a   pIdx->nKeyCol;.
d750: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
d760: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
d770: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
d780: 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e  db, pIdx, pIdx->
d790: 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74  nKeyCol+n) ) ret
d7a0: 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  urn;.    for(i=0
d7b0: 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  , j=pIdx->nKeyCo
d7c0: 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  l; i<nPk; i++){.
d7d0: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
d7e0: 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c  lumn(pIdx->aiCol
d7f0: 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  umn, pIdx->nKeyC
d800: 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ol, pPk->aiColum
d810: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
d820: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
d830: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  j] = pPk->aiColu
d840: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[i];.        p
d850: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d  Idx->azColl[j] =
d860: 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b   pPk->azColl[i];
d870: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
d880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d890: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
d8a0: 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65  olumn>=pIdx->nKe
d8b0: 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73  yCol+n );.    as
d8c0: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
d8d0: 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20  umn>=j );.  }.. 
d8e0: 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c   /* Add all tabl
d8f0: 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  e columns to the
d900: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
d910: 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  ex.  */.  if( nP
d920: 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  k<pTab->nCol ){.
d930: 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e      if( resizeIn
d940: 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50  dexObject(db, pP
d950: 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  k, pTab->nCol) )
d960: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
d970: 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70  (i=0, j=nPk; i<p
d980: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
d990: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
d9a0: 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c  olumn(pPk->aiCol
d9b0: 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20  umn, j, i) ){.  
d9c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
d9d0: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  pPk->nColumn );.
d9e0: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43          pPk->aiC
d9f0: 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20  olumn[j] = i;.  
da00: 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c        pPk->azCol
da10: 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[j] = "BINARY";
da20: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
da30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
da40: 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f  assert( pPk->nCo
da50: 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61  lumn==j );.    a
da60: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
da70: 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  l==j );.  }else{
da80: 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d  .    pPk->nColum
da90: 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  n = pTab->nCol;.
daa0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
dab0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
dac0: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
dad0: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
dae0: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
daf0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
db00: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
db10: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
db20: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
db30: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
db40: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
db50: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
db60: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
db70: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
db80: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
db90: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
dba0: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
dbb0: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
dbc0: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
dbd0: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
dbe0: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
dbf0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
dc00: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
dc10: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
dc20: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
dc30: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
dc40: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
dc50: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
dc60: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
dc70: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
dc80: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
dc90: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
dca0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
dcb0: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
dcc0: 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20  tly changed, so 
dcd0: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
dce0: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
dcf0: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
dd00: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
dd10: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
dd20: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
dd30: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
dd40: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
dd50: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
dd60: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
dd70: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
dd80: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
dd90: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
dda0: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
ddb0: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
ddc0: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
ddd0: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
dde0: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
ddf0: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
de00: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
de10: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
de20: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
de30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
de40: 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73  EndTable(.  Pars
de50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
de60: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
de70: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
de80: 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20  *pCons,         
de90: 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b    /* The ',' tok
dea0: 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  en after the las
deb0: 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a  t column defn. *
dec0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dee0: 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70  he ')' before op
def0: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45  tions in the CRE
df00: 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75  ATE TABLE */.  u
df10: 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20  8 tabOpts,      
df20: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
df30: 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55  table options. U
df40: 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53  sually 0. */.  S
df50: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
df60: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
df70: 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20   from a "CREATE 
df80: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a  ... AS SELECT" *
df90: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c   /* The new tabl
dfc0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
dfd0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
dfe0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
dff0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
e000: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
e010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
e020: 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20  tabase in which 
e030: 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20  the table lives 
e040: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
e050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
e060: 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  * An implied ind
e070: 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
e080: 2a 2f 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d  */..  if( (pEnd=
e090: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
e0a0: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
e0b0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
e0c0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70  urn;.  }.  p = p
e0d0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
e0e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
e0f0: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
e100: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
e110: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
e120: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
e130: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
e140: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
e150: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
e160: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
e170: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
e180: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
e190: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
e1a0: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
e1b0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
e1c0: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
e1d0: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
e1e0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
e1f0: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
e200: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
e210: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
e220: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
e230: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
e240: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
e250: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
e260: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
e270: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ).  */.  if( db-
e280: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
e290: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e    p->tnum = db->
e2a0: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
e2b0: 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
e2c0: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
e2d0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62  ITHOUT ROWID Tab
e2e0: 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62  les */.  if( tab
e2f0: 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75  Opts & TF_Withou
e300: 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66  tRowid ){.    if
e310: 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
e320: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
e330: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  y)==0 ){.      s
e340: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e350: 50 61 72 73 65 2c 20 22 6e 6f 20 50 52 49 4d 41  Parse, "no PRIMA
e360: 52 59 20 4b 45 59 20 66 6f 72 20 74 61 62 6c 65  RY KEY for table
e370: 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b   %s", p->zName);
e380: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e390: 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d    p->tabFlags |=
e3a0: 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64   TF_WithoutRowid
e3b0: 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54  ;.      convertT
e3c0: 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
e3d0: 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  le(pParse, p);. 
e3e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20     }.  }..  iDb 
e3f0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
e400: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
e410: 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
e420: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
e430: 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  CK.  /* Resolve 
e440: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45  names in all CHE
e450: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  CK constraint ex
e460: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
e470: 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20    if( p->pCheck 
e480: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
e490: 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
e4a0: 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43  ce(pParse, p, NC
e4b0: 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e  _IsCheck, 0, p->
e4c0: 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e  pCheck);.  }.#en
e4d0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
e4e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
e4f0: 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69  K) */..  /* Esti
e500: 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
e510: 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68   row size for th
e520: 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20  e table and for 
e530: 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69  all implied indi
e540: 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74  ces */.  estimat
e550: 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a  eTableWidth(p);.
e560: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
e570: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
e580: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
e590: 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78     estimateIndex
e5a0: 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d  Width(pIdx);.  }
e5b0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
e5c0: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
e5d0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
e5e0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
e5f0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
e600: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
e610: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
e620: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
e630: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
e640: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
e650: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
e660: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
e670: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
e680: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
e690: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
e6a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
e6b0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
e6c0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
e6d0: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
e6e0: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
e6f0: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
e700: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
e710: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
e720: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
e730: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
e740: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
e750: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
e760: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
e770: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
e780: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e790: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
e7a0: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
e7b0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
e7c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
e7d0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
e7e0: 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
e7f0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
e800: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
e810: 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
e820: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
e830: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
e840: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
e850: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
e860: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
e870: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
e880: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
e890: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e8a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e8b0: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
e8c0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
e8d0: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
e8e0: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
e8f0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
e900: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
e910: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
e920: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
e930: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
e940: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
e950: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
e960: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
e970: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
e980: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
e990: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
e9a0: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
e9b0: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
e9c0: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
e9d0: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
e9e0: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
e9f0: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
ea00: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
ea10: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
ea20: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
ea30: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
ea40: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
ea50: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
ea60: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
ea70: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
ea80: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
ea90: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
eaa0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
eab0: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
eac0: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
ead0: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
eae0: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
eaf0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
eb00: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
eb10: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
eb20: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
eb30: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
eb40: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
eb50: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
eb60: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
eb70: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
eb80: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
eb90: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
eba0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
ebb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
ebc0: 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a  arse->nTab==1);.
ebd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ebe0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
ebf0: 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72  enWrite, 1, pPar
ec00: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62  se->regRoot, iDb
ec10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ec20: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
ec30: 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b  OPFLAG_P2ISREG);
ec40: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
ec50: 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  Tab = 2;.      s
ec60: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
ec70: 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
ec80: 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20  Table, 1);.     
ec90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
eca0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
ecb0: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  &dest);.      sq
ecc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ecd0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b  v, OP_Close, 1);
ece0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
ecf0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
ed00: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
ed10: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
ed20: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
ed30: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
ed40: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
ed50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
ed60: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
ed70: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
ed80: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
ed90: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
eda0: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
edb0: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
edc0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
edd0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  l = 0;.        p
ede0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
edf0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ee00: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
ee10: 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
ee20: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
ee30: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
ee40: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
ee50: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
ee60: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
ee70: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
ee80: 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
ee90: 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20  leStmt(db, p);. 
eea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
eeb0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74  Token *pEnd2 = t
eec0: 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73 65  abOpts ? &pParse
eed0: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70  ->sLastToken : p
eee0: 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  End;.      n = (
eef0: 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20  int)(pEnd2->z - 
ef00: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
ef10: 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  en.z);.      if(
ef20: 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b   pEnd2->z[0]!=';
ef30: 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e  ' ) n += pEnd2->
ef40: 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  n;.      zStmt =
ef50: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
ef60: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
ef70: 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
ef80: 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
ef90: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
efa0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
efb0: 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
efc0: 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
efd0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
efe0: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
eff0: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
f000: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
f010: 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
f020: 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
f030: 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
f040: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
f050: 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a  e've collected..
f060: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
f070: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
f080: 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
f090: 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
f0a0: 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
f0b0: 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
f0c0: 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
f0d0: 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
f0e0: 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
f0f0: 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
f100: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
f110: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
f120: 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a  LE(iDb),.      z
f130: 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
f140: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
f150: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72  Name,.      pPar
f160: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20  se->regRoot,.   
f170: 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20     zStmt,.      
f180: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
f190: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
f1a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
f1b0: 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
f1c0: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
f1d0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66  arse, iDb);..#if
f1e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f1f0: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
f200: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
f210: 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
f220: 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74   create an sqlit
f230: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
f240: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70   for.    ** keep
f250: 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74  ing track of aut
f260: 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e  oincrement keys.
f270: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f280: 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
f290: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
f2a0: 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20  {.      Db *pDb 
f2b0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
f2c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
f2d0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
f2e0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
f2f0: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
f300: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  Db->pSchema->pSe
f310: 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qTab==0 ){.     
f320: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
f330: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
f340: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
f350: 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f  TABLE %Q.sqlite_
f360: 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65  sequence(name,se
f370: 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  q)",.          p
f380: 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  Db->zName.      
f390: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
f3a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
f3b0: 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
f3c0: 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
f3d0: 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
f3e0: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
f3f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f400: 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76  dParseSchemaOp(v
f410: 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
f420: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
f430: 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27  (db, "tbl_name='
f440: 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74  %q' AND type!='t
f450: 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61  rigger'", p->zNa
f460: 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  me));.  }...  /*
f470: 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
f480: 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
f490: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
f4a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
f4b0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
f4c0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
f4d0: 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20  Table *pOld;.   
f4e0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
f4f0: 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20   = p->pSchema;. 
f500: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f510: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
f520: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
f530: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
f540: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
f550: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
f560: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
f590: 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65  trlen30(p->zName
f5a0: 29 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  ),p);.    if( pO
f5b0: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
f5c0: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
f5d0: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
f5e0: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
f5f0: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
f600: 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  /.      db->mall
f610: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
f620: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
f630: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  }.    pParse->pN
f640: 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
f650: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
f660: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
f670: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
f680: 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
f690: 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
f6a0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
f6b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
f6c0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
f6d0: 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   *)pParse->sName
f6e0: 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  Token.z;.      i
f6f0: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  nt nName;.      
f700: 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
f710: 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
f720: 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
f730: 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  Cons->z==0 ){.  
f740: 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45        pCons = pE
f750: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
f760: 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28    nName = (int)(
f770: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
f780: 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b  ons->z - zName);
f790: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
f7a0: 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
f7b0: 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
f7c0: 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
f7d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
f7e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
f7f0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
f800: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
f810: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
f820: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
f830: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
f840: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
f850: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
f860: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
f870: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
f880: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
f890: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
f8a0: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
f8b0: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
f8c0: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
f8d0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
f8e0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
f8f0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
f900: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
f910: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
f920: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
f930: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
f940: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
f950: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
f960: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
f970: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
f980: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
f990: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
f9a0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
f9b0: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p,        /* TRU
f9c0: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
f9d0: 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  Y view */.  int 
f9e0: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f  noErr          /
f9f0: 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72  * Suppress error
fa00: 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45   messages if VIE
fa10: 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  W already exists
fa20: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
fa30: 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  p;.  int n;.  co
fa40: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54  nst char *z;.  T
fa50: 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46  oken sEnd;.  DbF
fa60: 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b  ixer sFix;.  Tok
fa70: 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20  en *pName = 0;. 
fa80: 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69   int iDb;.  sqli
fa90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
faa0: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
fab0: 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20  rse->nVar>0 ){. 
fac0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
fad0: 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61  sg(pParse, "para
fae0: 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61  meters are not a
faf0: 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22  llowed in views"
fb00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
fb10: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
fb20: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
fb30: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
fb40: 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
fb50: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
fb60: 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20  me2, isTemp, 1, 
fb70: 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d  0, noErr);.  p =
fb80: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
fb90: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
fba0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
fbb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
fbc0: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
fbd0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
fbe0: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
fbf0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
fc00: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
fc10: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
fc20: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
fc30: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
fc40: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ->pSchema);.  sq
fc50: 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
fc60: 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
fc70: 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b   "view", pName);
fc80: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
fc90: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
fca0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 73  Select) ){.    s
fcb0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
fcc0: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
fcd0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
fce0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
fcf0: 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
fd00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
fd10: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
fd20: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
fd30: 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
fd40: 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
fd50: 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
fd60: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
fd70: 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
fd80: 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
fd90: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
fda0: 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
fdb0: 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
fdc0: 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
fdd0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
fde0: 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
fdf0: 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
fe00: 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
fe10: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
fe20: 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52  b, pSelect, EXPR
fe30: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 73  DUP_REDUCE);.  s
fe40: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
fe50: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
fe60: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
fe70: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
fe80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
fe90: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
fea0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69  ){.    sqlite3Vi
feb0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
fec0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
fed0: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
fee0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
fef0: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
ff00: 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
ff10: 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
ff20: 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
ff30: 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
ff40: 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 41 4c  tToken;.  if( AL
ff50: 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30 5d 21 3d  WAYS(sEnd.z[0]!=
ff60: 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  0) && sEnd.z[0]!
ff70: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
ff80: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
ff90: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
ffa0: 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64    n = (int)(sEnd
ffb0: 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b  .z - pBegin->z);
ffc0: 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a  .  z = pBegin->z
ffd0: 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59  ;.  while( ALWAY
ffe0: 53 28 6e 3e 30 29 20 26 26 20 73 71 6c 69 74 65  S(n>0) && sqlite
fff0: 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29  3Isspace(z[n-1])
10000 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
10010 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
10020 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
10030 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
10040 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
10050 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
10060 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
10070 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
10080 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
10090 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29   0, &sEnd, 0, 0)
100a0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
100b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
100c0 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
100d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
100e0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
100f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10100 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10110 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  )./*.** The Tabl
10120 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
10130 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
10140 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
10150 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
10160 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
10170 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
10180 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
10190 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
101a0 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
101b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
101c0 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
101d0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
101e0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
101f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
10200 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
10210 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10220 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
10230 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
10240 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
10250 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
10260 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
10270 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
10280 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
10290 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
102a0 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
102b0 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
102c0 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
102d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
102e0 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
102f0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
10300 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
10310 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
10320 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
10330 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
10340 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
10350 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
10360 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
10370 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65  ion for malloc e
10380 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28  rrors */.  int (
10390 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e  *xAuth)(void*,in
103a0 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  t,const char*,co
103b0 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
103c0 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
103d0 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *);..  assert( p
103e0 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
103f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10400 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
10410 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
10420 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
10430 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  pTable) ){.    r
10440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
10450 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  OR;.  }.  if( Is
10460 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
10470 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
10480 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
10490 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
104a0 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
104b0 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
104c0 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
104d0 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
104e0 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
104f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
10500 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
10510 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
10520 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
10530 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
10540 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
10550 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
10560 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
10570 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
10580 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
10590 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
105a0 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
105b0 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
105c0 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
105d0 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
105e0 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
105f0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
10600 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
10610 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
10620 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
10630 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
10640 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
10650 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
10660 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20  ally, the error 
10670 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75  above is now cau
10680 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
10690 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74  ching this point
106a0 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66  ..  ** But the f
106b0 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73  ollowing test is
106c0 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74   still important
106d0 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65   as it does come
106e0 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20   up.  ** in the 
106f0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20  following:.  ** 
10700 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
10710 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28   TABLE main.ex1(
10720 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  a);.  **     CRE
10730 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78  ATE TEMP VIEW ex
10740 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52  1 AS SELECT a FR
10750 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20  OM ex1;.  **    
10760 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
10770 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20  emp.ex1;.  */.  
10780 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
10790 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
107a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
107b0 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
107c0 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
107d0 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
107e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
107f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10800 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
10810 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
10820 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
10830 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
10840 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
10850 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
10860 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
10870 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
10880 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
10890 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
108a0 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
108b0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
108c0 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
108d0 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
108e0 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
108f0 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
10900 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
10910 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
10920 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
10930 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
10940 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
10950 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
10960 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
10970 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
10980 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
10990 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
109a0 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
109b0 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
109c0 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
109d0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
109e0 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
109f0 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  ct, 0);.  if( pS
10a00 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61  el ){.    u8 ena
10a10 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64  bleLookaside = d
10a20 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
10a30 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70  abled;.    n = p
10a40 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
10a50 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
10a60 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
10a70 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
10a80 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
10a90 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d  ol = -1;.    db-
10aa0 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
10ab0 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  led = 0;.#ifndef
10ac0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10ad0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78  HORIZATION.    x
10ae0 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68  Auth = db->xAuth
10af0 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
10b00 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
10b10 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
10b20 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
10b30 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  se, pSel);.    d
10b40 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
10b50 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    pSel
10b60 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
10b70 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
10b80 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65  Parse, pSel);.#e
10b90 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  ndif.    db->loo
10ba0 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
10bb0 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64  = enableLookasid
10bc0 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e;.    pParse->n
10bd0 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28  Tab = n;.    if(
10be0 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
10bf0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
10c00 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
10c10 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
10c20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
10c30 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  .      pTable->a
10c40 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
10c50 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
10c60 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
10c70 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
10c80 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
10c90 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
10ca0 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
10cb0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10cc0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
10cd0 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65  ld(db, 0, pTable
10ce0 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
10cf0 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
10d00 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42  ema->flags |= DB
10d10 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
10d20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d30 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
10d40 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
10d50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10d60 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
10d70 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73  , pSel);.  } els
10d80 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
10d90 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
10da0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
10db0 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  /.  return nErr;
10dc0 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
10dd0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10de0 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
10df0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10e00 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
10e10 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
10e20 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
10e30 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
10e40 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
10e50 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
10e60 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
10e70 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
10e80 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
10e90 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
10ea0 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
10eb0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
10ec0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
10ed0 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20  eld(db, idx, 0) 
10ee0 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  );.  if( !DbHasP
10ef0 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
10f00 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
10f10 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
10f20 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
10f30 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
10f40 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
10f50 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48  sh); i;i=sqliteH
10f60 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
10f70 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
10f80 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
10f90 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
10fa0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
10fb0 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c   sqliteDeleteCol
10fc0 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61  umnNames(db, pTa
10fd0 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  b);.      pTab->
10fe0 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
10ff0 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  pTab->nCol = 0;.
11000 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
11010 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
11020 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
11030 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
11040 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
11050 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
11060 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11070 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
11080 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11090 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
110a0 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
110b0 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
110c0 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
110d0 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
110e0 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
110f0 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
11100 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
11110 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
11120 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
11130 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
11140 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
11150 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a  om.** to iTo..**
11160 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38  .** Ticket #1728
11170 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61  :  The symbol ta
11180 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20  ble might still 
11190 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74  contain informat
111a0 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73  ion.** on tables
111b0 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20   and/or indices 
111c0 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f  that are the pro
111d0 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65  cess of being de
111e0 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75  leted..** If you
111f0 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e   are unlucky, on
11200 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74  e of those delet
11210 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61  ed indices or ta
11220 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61  bles might.** ha
11230 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ve the same root
11240 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74  page number as t
11250 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72  he real table or
11260 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a   index that is.*
11270 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20  * being moved.  
11280 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f  So we cannot sto
11290 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65  p searching afte
112a0 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
112b0 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  h .** because th
112c0 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69  e first match mi
112d0 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  ght be for one o
112e0 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e  f the deleted in
112f0 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c  dices.** or tabl
11300 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74  es and not the t
11310 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20  able/index that 
11320 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
11330 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d  g moved..** We m
11340 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f  ust continue loo
11350 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74  ping until all t
11360 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
11370 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61  s with.** rootpa
11380 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62  ge==iFrom have b
11390 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  een converted to
113a0 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65   have a rootpage
113b0 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72   of iTo.** in or
113c0 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69  der to be certai
113d0 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68  n that we got th
113e0 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a  e right one..*/.
113f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11400 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76  MIT_AUTOVACUUM.v
11410 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50  oid sqlite3RootP
11420 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33  ageMoved(sqlite3
11430 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
11440 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
11450 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
11460 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
11470 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b  Hash;.  Db *pDb;
11480 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
11490 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
114a0 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
114b0 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
114c0 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68  Db[iDb];.  pHash
114d0 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
114e0 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72  ->tblHash;.  for
114f0 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
11500 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
11510 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
11520 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
11530 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
11540 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
11550 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
11560 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
11570 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
11580 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
11590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48  ;.    }.  }.  pH
115a0 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
115b0 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
115c0 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
115d0 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
115e0 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
115f0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
11600 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
11610 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
11620 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
11630 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
11640 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
11650 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
11660 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iTo;.    }.  }.}
11670 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
11680 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
11690 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
116a0 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
116b0 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
116c0 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
116d0 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
116e0 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
116f0 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
11700 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
11710 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
11720 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
11730 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
11740 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
11750 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
11760 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
11770 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
11780 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
11790 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
117a0 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
117b0 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
117c0 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
117d0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
117e0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
117f0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
11800 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
11810 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11820 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
11830 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11840 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
11850 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
11860 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
11870 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
11880 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
11890 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
118a0 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
118b0 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
118c0 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
118d0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
118e0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
118f0 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
11900 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
11910 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
11920 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
11930 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
11940 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
11950 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
11960 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
11970 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
11980 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
11990 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
119a0 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
119b0 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
119c0 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
119d0 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
119e0 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
119f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11a00 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
11a10 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
11a20 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
11a30 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
11a40 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
11a50 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
11a60 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
11a70 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
11a80 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
11a90 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
11aa0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
11ab0 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
11ac0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
11ad0 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
11ae0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
11af0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
11b00 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
11b10 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
11b20 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
11b30 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
11b40 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
11b50 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
11b60 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
11b70 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
11b80 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
11b90 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
11ba0 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
11bb0 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
11bc0 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
11bd0 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
11be0 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
11bf0 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
11c00 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
11c10 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
11c20 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
11c30 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
11c40 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
11c50 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
11c60 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
11c70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
11c80 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
11c90 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
11ca0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
11cb0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
11cc0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
11cd0 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
11ce0 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
11cf0 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
11d00 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
11d10 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
11d20 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
11d30 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
11d40 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
11d50 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
11d60 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
11d70 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
11d80 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
11d90 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
11da0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
11db0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
11dc0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
11dd0 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
11de0 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
11df0 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
11e00 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
11e10 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
11e20 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
11e30 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
11e40 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
11e50 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
11e60 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
11e70 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
11e80 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
11e90 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
11ea0 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
11eb0 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
11ec0 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
11ed0 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
11ee0 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
11ef0 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
11f00 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
11f10 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
11f20 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
11f30 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
11f40 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
11f50 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
11f60 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
11f70 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
11f80 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
11f90 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
11fa0 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
11fb0 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
11fc0 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
11fd0 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
11fe0 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
11ff0 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
12000 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
12010 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
12020 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
12030 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
12040 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
12050 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
12060 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
12070 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
12080 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
12090 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
120a0 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
120b0 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
120c0 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
120d0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
120e0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
120f0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
12100 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
12110 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
12120 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
12130 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
12140 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
12150 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
12160 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
12170 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
12180 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
12190 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
121a0 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
121b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
121c0 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
121d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
121e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
121f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
12200 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
12210 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
12220 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73  hema);.      ass
12230 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
12240 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
12250 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74  Db );.      dest
12260 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
12270 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44  se, iLargest, iD
12280 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72  b);.      iDestr
12290 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
122a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
122b0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
122c0 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  e entries from t
122d0 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20  he sqlite_statN 
122e0 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e  tables (for N in
122f0 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74   (1,2,3)).** aft
12300 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20  er a DROP INDEX 
12310 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f  or DROP TABLE co
12320 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
12330 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65   void sqlite3Cle
12340 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20  arStatTables(.  
12350 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12360 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
12370 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12380 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
12390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
123a0 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
123b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
123c0 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20   *zType,     /* 
123d0 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a  "idx" or "tbl" *
123e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
123f0 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61  zName      /* Na
12400 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74  me of index or t
12410 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
12420 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
12430 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72   *zDbName = pPar
12440 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
12450 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d  .zName;.  for(i=
12460 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20  1; i<=4; i++){. 
12470 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d     char zTab[24]
12480 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
12490 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
124a0 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65  ab),zTab,"sqlite
124b0 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20  _stat%d",i);.   
124c0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
124d0 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
124e0 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29  , zTab, zDbName)
124f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12500 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
12510 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
12520 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
12530 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20  WHERE %s=%Q",.  
12540 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a        zDbName, z
12550 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d  Tab, zType, zNam
12560 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
12570 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
12580 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
12590 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rop a table..*/.
125a0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
125b0 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
125c0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
125d0 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69  pTab, int iDb, i
125e0 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64  nt isView){.  Vd
125f0 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
12600 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12610 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  b;.  Trigger *pT
12620 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44  rigger;.  Db *pD
12630 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
12640 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  ];..  v = sqlite
12650 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
12660 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
12670 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67   );.  sqlite3Beg
12680 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
12690 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
126a0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
126b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
126c0 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
126d0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
126e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
126f0 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
12700 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
12710 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
12720 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
12730 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
12740 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
12750 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72  de.  ** is gener
12760 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65  ated to remove e
12770 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69  ntries from sqli
12780 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72  te_master and/or
12790 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d  .  ** sqlite_tem
127a0 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
127b0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72  ired..  */.  pTr
127c0 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54  igger = sqlite3T
127d0 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73  riggerList(pPars
127e0 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c  e, pTab);.  whil
127f0 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
12800 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
12810 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ger->pSchema==pT
12820 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a  ab->pSchema || .
12830 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
12840 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
12850 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
12860 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70  .    sqlite3Drop
12870 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73  TriggerPtr(pPars
12880 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20  e, pTrigger);.  
12890 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
128a0 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
128b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
128c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
128d0 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  MENT.  /* Remove
128e0 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20   any entries of 
128f0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
12900 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  nce table associ
12910 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  ated with.  ** t
12920 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
12930 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20  ropped. This is 
12940 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  done before the 
12950 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64  table is dropped
12960 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72  .  ** at the btr
12970 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73  ee level, in cas
12980 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  e the sqlite_seq
12990 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64  uence table need
129a0 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61  s to.  ** move a
129b0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
129c0 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
129d0 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
129e0 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20  m mode)..  */.  
129f0 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
12a00 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
12a10 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  ement ){.    sql
12a20 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
12a30 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44  pParse,.      "D
12a40 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71  ELETE FROM %Q.sq
12a50 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48  lite_sequence WH
12a60 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
12a70 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
12a80 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
12a90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
12aa0 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
12ab0 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
12ac0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
12ad0 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
12ae0 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e   the.  ** table.
12af0 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d   The program nam
12b00 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  e loops through 
12b10 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
12b20 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a   and deletes.  *
12b30 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
12b40 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
12b50 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
12b60 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
12b70 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65  eing.  ** droppe
12b80 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
12b90 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
12ba0 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
12bb0 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a  gger can be.  **
12bc0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
12bd0 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68  temp database th
12be0 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
12bf0 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a  able in another.
12c00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
12c10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
12c20 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
12c30 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20   .      "DELETE 
12c40 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
12c50 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
12c60 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
12c70 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
12c80 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
12c90 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e  E(iDb), pTab->zN
12ca0 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56  ame);.  if( !isV
12cb0 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61  iew && !IsVirtua
12cc0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64  l(pTab) ){.    d
12cd0 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72  estroyTable(pPar
12ce0 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a  se, pTab);.  }..
12cf0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
12d00 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  table entry from
12d10 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e   SQLite's intern
12d20 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f  al schema and mo
12d30 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63  dify.  ** the sc
12d40 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a  hema cookie..  *
12d50 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
12d60 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
12d70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12d80 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c  (v, OP_VDestroy,
12d90 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
12da0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
12db0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12dc0 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
12dd0 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c  able, iDb, 0, 0,
12de0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
12df0 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67  ;.  sqlite3Chang
12e00 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
12e10 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69  iDb);.  sqliteVi
12e20 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
12e30 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Db);.}../*.** Th
12e40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12e50 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
12e60 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
12e70 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
12e80 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
12e90 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
12ea0 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
12eb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
12ec0 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
12ed0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
12ee0 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
12ef0 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a  ew, int noErr){.
12f00 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
12f10 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
12f20 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
12f30 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
12f40 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
12f50 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
12f60 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
12f70 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  able;.  }.  asse
12f80 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
12f90 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
12fa0 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
12fb0 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
12fc0 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
12fd0 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  ++;.  pTab = sql
12fe0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
12ff0 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69  tem(pParse, isVi
13000 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ew, &pName->a[0]
13010 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29  );.  if( noErr )
13020 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
13030 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  --;..  if( pTab=
13040 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
13050 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64  Err ) sqlite3Cod
13060 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
13070 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
13080 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
13090 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
130a0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
130b0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
130c0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
130d0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
130e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
130f0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
13100 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54  b );..  /* If pT
13110 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  ab is a virtual 
13120 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77  table, call View
13130 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
13140 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20   to ensure.  ** 
13150 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
13160 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  d..  */.  if( Is
13170 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
13180 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
13190 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
131a0 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
131b0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
131c0 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  able;.  }.#ifnde
131d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
131e0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
131f0 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
13200 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
13210 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
13220 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  E(iDb);.    cons
13230 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
13240 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
13250 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
13260 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20   *zArg2 = 0;.   
13270 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13280 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
13290 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
132a0 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20  b, 0, zDb)){.   
132b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
132c0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
132d0 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
132e0 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
132f0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
13300 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
13310 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
13320 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
13330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13340 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
13350 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
13360 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13370 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13380 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
13390 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
133a0 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20  ){.      code = 
133b0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
133c0 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20  LE;.      zArg2 
133d0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
133e0 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d  le(db, pTab)->pM
133f0 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69  od->zName;.#endi
13400 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
13410 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
13420 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
13430 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
13440 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
13450 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
13460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
13470 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
13480 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
13490 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
134a0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
134b0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62  arse, code, pTab
134c0 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20  ->zName, zArg2, 
134d0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
134e0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
134f0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
13500 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
13510 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
13520 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e  E_DELETE, pTab->
13530 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
13540 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13550 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
13560 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
13570 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
13580 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
13590 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
135a0 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74  =0 .    && sqlit
135b0 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
135c0 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
135d0 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b  stat", 11)!=0 ){
135e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
135f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
13600 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
13610 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62  e dropped", pTab
13620 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
13630 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
13640 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  le;.  }..#ifndef
13650 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
13660 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52  W.  /* Ensure DR
13670 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20  OP TABLE is not 
13680 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20  used on a view, 
13690 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73  and DROP VIEW is
136a0 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f   not used.  ** o
136b0 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  n a table..  */.
136c0 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20    if( isView && 
136d0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
136e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
136f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13700 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20  "use DROP TABLE 
13710 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20  to delete table 
13720 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
13730 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
13740 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
13750 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
13760 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  & pTab->pSelect 
13770 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13780 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13790 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f  use DROP VIEW to
137a0 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22   delete view %s"
137b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
137c0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
137d0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  op_table;.  }.#e
137e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
137f0 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
13800 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ve the table fro
13810 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
13820 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e  le.  ** on disk.
13830 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
13840 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13850 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
13860 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
13870 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
13880 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
13890 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
138a0 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
138b0 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54  , iDb, "tbl", pT
138c0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
138d0 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62  sqlite3FkDropTab
138e0 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
138f0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  , pTab);.    sql
13900 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
13910 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
13920 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20  iDb, isView);.  
13930 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  }..exit_drop_tab
13940 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
13950 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
13960 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
13970 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13980 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
13990 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
139a0 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
139b0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
139c0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
139d0 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
139e0 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
139f0 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
13a00 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
13a10 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
13a20 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
13a30 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
13a40 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
13a50 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
13a60 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
13a70 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
13a80 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
13a90 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74  rred to (a.k.a t
13aa0 68 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c  he "parent" tabl
13ab0 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61  e).  pToCol is a
13ac0 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c   list.** of tabl
13ad0 65 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  es in the parent
13ae0 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61   pTo table.  fla
13af0 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
13b00 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
13b10 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
13b20 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
13b30 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
13b40 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
13b50 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
13b60 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
13b70 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
13b80 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
13b90 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
13ba0 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
13bb0 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
13bc0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
13bd0 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
13be0 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
13bf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65  ..**.** The fore
13c00 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66  ign key is set f
13c10 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f  or IMMEDIATE pro
13c20 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73  cessing.  A subs
13c30 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74  equent call.** t
13c40 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  o sqlite3DeferFo
13c50 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74  reignKey() might
13c60 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20   change this to 
13c70 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69  DEFERRED..*/.voi
13c80 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  d sqlite3CreateF
13c90 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72  oreignKey(.  Par
13ca0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13cb0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
13cc0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
13cd0 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f  st *pFromCol,  /
13ce0 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  * Columns in thi
13cf0 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69  s table that poi
13d00 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c  nt to other tabl
13d10 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  e */.  Token *pT
13d20 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  o,          /* N
13d30 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72  ame of the other
13d40 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
13d50 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20  List *pToCol,   
13d60 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
13d70 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
13d80 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
13d90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
13da0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
13db0 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29  algorithms. */.)
13dc0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
13dd0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69  = pParse->db;.#i
13de0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13df0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
13e00 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
13e10 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f  .  FKey *pNextTo
13e20 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  ;.  Table *p = p
13e30 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
13e40 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
13e50 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
13e60 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ol;.  char *z;..
13e70 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
13e80 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
13e90 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
13ea0 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  B ) goto fk_end;
13eb0 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
13ec0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
13ed0 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
13ee0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43      if( NEVER(iC
13ef0 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f  ol<0) ) goto fk_
13f00 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
13f10 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
13f20 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
13f30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13f40 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
13f50 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
13f60 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
13f70 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
13f80 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
13f90 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
13fa0 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
13fb0 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
13fc0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
13fd0 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
13fe0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
13ff0 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
14000 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
14010 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
14020 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14030 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
14040 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
14050 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
14060 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
14070 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
14080 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
14090 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
140a0 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
140b0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
140c0 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
140d0 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
140e0 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
140f0 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
14100 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28  (nCol-1)*sizeof(
14110 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
14120 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
14130 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
14140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
14150 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
14160 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
14170 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
14180 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
14190 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
141a0 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
141b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
141c0 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  o(db, nByte );. 
141d0 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b   if( pFKey==0 ){
141e0 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
141f0 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70  ;.  }.  pFKey->p
14200 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
14210 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
14220 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
14230 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43  char*)&pFKey->aC
14240 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65  ol[nCol];.  pFKe
14250 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65  y->zTo = z;.  me
14260 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20  mcpy(z, pTo->z, 
14270 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f  pTo->n);.  z[pTo
14280 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->n] = 0;.  sqli
14290 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20  te3Dequote(z);. 
142a0 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a   z += pTo->n+1;.
142b0 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
142c0 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
142d0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
142e0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
142f0 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
14300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
14310 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
14320 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
14330 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
14340 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
14350 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
14360 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
14370 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
14380 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
14390 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
143a0 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
143b0 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
143c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
143d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
143e0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
143f0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
14400 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14410 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
14420 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
14430 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
14440 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
14450 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
14460 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
14470 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
14480 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
14490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
144a0 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
144b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
144c0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
144d0 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
144e0 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
144f0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
14500 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
14510 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20  [i].zCol = z;.  
14520 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54      memcpy(z, pT
14530 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
14540 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d  , n);.      z[n]
14550 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d   = 0;.      z +=
14560 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n+1;.    }.  }.
14570 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
14580 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79  red = 0;.  pFKey
14590 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28  ->aAction[0] = (
145a0 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66  u8)(flags & 0xff
145b0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
145c0 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f   ON DELETE actio
145d0 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41  n */.  pFKey->aA
145e0 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28  ction[1] = (u8)(
145f0 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20  (flags >> 8 ) & 
14600 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20  0xff);    /* ON 
14610 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f  UPDATE action */
14620 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
14630 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
14640 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63  ld(db, 0, p->pSc
14650 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74  hema) );.  pNext
14660 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c  To = (FKey *)sql
14670 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
14680 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79  p->pSchema->fkey
14690 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b  Hash, .      pFK
146a0 65 79 2d 3e 7a 54 6f 2c 20 73 71 6c 69 74 65 33  ey->zTo, sqlite3
146b0 53 74 72 6c 65 6e 33 30 28 70 46 4b 65 79 2d 3e  Strlen30(pFKey->
146c0 7a 54 6f 29 2c 20 28 76 6f 69 64 20 2a 29 70 46  zTo), (void *)pF
146d0 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  Key.  );.  if( p
146e0 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b  NextTo==pFKey ){
146f0 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
14700 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 67  ailed = 1;.    g
14710 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
14720 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b    if( pNextTo ){
14730 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
14740 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30  xtTo->pPrevTo==0
14750 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70   );.    pFKey->p
14760 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f  NextTo = pNextTo
14770 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70  ;.    pNextTo->p
14780 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a  PrevTo = pFKey;.
14790 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
147a0 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
147b0 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
147c0 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
147d0 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
147e0 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
147f0 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
14800 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14810 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20   pFKey);.#endif 
14820 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
14830 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
14840 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  KEY) */.  sqlite
14850 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
14860 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20  db, pFromCol);. 
14870 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
14880 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f  Delete(db, pToCo
14890 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  l);.}../*.** Thi
148a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
148b0 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54  led when an INIT
148c0 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20  IALLY IMMEDIATE 
148d0 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
148e0 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20  ERRED.** clause 
148f0 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20  is seen as part 
14900 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  of a foreign key
14910 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68   definition.  Th
14920 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20  e isDeferred.** 
14930 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66  parameter is 1 f
14940 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  or INITIALLY DEF
14950 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20  ERRED and 0 for 
14960 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
14970 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61  ATE..** The beha
14980 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74  vior of the most
14990 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65   recently create
149a0 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  d foreign key is
149b0 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63   adjusted.** acc
149c0 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69  ordingly..*/.voi
149d0 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f  d sqlite3DeferFo
149e0 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a  reignKey(Parse *
149f0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65  pParse, int isDe
14a00 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66  ferred){.#ifndef
14a10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
14a20 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65  EIGN_KEY.  Table
14a30 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a   *pTab;.  FKey *
14a40 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54  pFKey;.  if( (pT
14a50 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
14a60 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70  wTable)==0 || (p
14a70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b  FKey = pTab->pFK
14a80 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ey)==0 ) return;
14a90 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66  .  assert( isDef
14aa0 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65  erred==0 || isDe
14ab0 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20  ferred==1 ); /* 
14ac0 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31  EV: R-30323-2191
14ad0 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73  7 */.  pFKey->is
14ae0 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69  Deferred = (u8)i
14af0 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69  sDeferred;.#endi
14b00 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  f.}../*.** Gener
14b10 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
14b20 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66  ll erase and ref
14b30 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e  ill index *pIdx.
14b40 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65    This is.** use
14b50 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
14b60 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20  a newly created 
14b70 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f  index or to reco
14b80 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e  mpute the.** con
14b90 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  tent of an index
14ba0 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
14bb0 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  a REINDEX comman
14bc0 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52  d..**.** if memR
14bd0 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  ootPage is not n
14be0 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e  egative, it mean
14bf0 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
14c00 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65   is newly.** cre
14c10 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73  ated.  The regis
14c20 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79  ter specified by
14c30 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
14c40 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
14c50 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
14c60 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
14c70 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
14c80 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
14c90 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
14ca0 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
14cb0 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
14cc0 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
14cd0 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
14ce0 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
14cf0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
14d00 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
14d10 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
14d20 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
14d30 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
14d40 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
14d50 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
14d60 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
14d70 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
14d80 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
14d90 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
14da0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
14db0 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
14dc0 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
14dd0 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
14de0 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
14df0 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
14e00 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
14e10 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
14e20 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
14e30 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b  /.  int iSorter;
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
14e60 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65  ned by OpenSorte
14e70 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f  r (if in use) */
14e80 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ea0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
14eb0 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
14ec0 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20   int addr2;     
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ee0 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75  /* Address to ju
14ef0 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69  mp to for next i
14f00 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  teration */.  in
14f10 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f30 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
14f40 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ex */.  int iPar
14f50 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20  tIdxLabel;      
14f60 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74         /* Jump t
14f70 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20  o this label to 
14f80 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20  skip a row */.  
14f90 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14fb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14fc0 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  into this virtua
14fd0 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b  l machine */.  K
14fe0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20  eyInfo *pKey;   
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15000 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64   KeyInfo for ind
15010 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ex */.  int regR
15020 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
15030 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
15040 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d  er holding assem
15050 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65 63 6f  blied index reco
15060 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rd */.  sqlite3 
15070 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
15080 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  ;      /* The da
15090 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
150a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  n */.  int iDb =
150b0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
150c0 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
150d0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
150e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
150f0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
15100 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
15110 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
15120 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49  LITE_REINDEX, pI
15130 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a  ndex->zName, 0,.
15140 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
15150 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20  b].zName ) ){.  
15160 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
15170 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69  ndif..  /* Requi
15180 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
15190 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  on the table to 
151a0 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65  perform this ope
151b0 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ration */.  sqli
151c0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
151d0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
151e0 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a  tnum, 1, pTab->z
151f0 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71  Name);..  v = sq
15200 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15210 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
15220 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
15230 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20   memRootPage>=0 
15240 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65  ){.    tnum = me
15250 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c  mRootPage;.  }el
15260 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70  se{.    tnum = p
15270 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d  Index->tnum;.  }
15280 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
15290 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
152a0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
152b0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
152c0 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69 66  sorter cursor if
152d0 20 77 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f   we are to use o
152e0 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72  ne. */.  iSorter
152f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
15300 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  +;.  sqlite3Vdbe
15310 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
15320 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72  terOpen, iSorter
15330 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 0a  , 0, 0, (char*).
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15350 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
15360 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50 34 5f  foRef(pKey), P4_
15370 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20  KEYINFO);..  /* 
15380 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  Open the table. 
15390 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
153a0 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
153b0 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  le, inserting in
153c0 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73  dex.  ** records
153d0 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
153e0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70  . */.  sqlite3Op
153f0 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
15400 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
15410 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
15420 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
15430 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15440 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
15450 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d  );.  regRecord =
15460 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
15470 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73  eg(pParse);..  s
15480 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
15490 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
154a0 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67  Index, iTab, reg
154b0 52 65 63 6f 72 64 2c 20 30 2c 20 26 69 50 61 72  Record, 0, &iPar
154c0 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71  tIdxLabel);.  sq
154d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
154e0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
154f0 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  rt, iSorter, reg
15500 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
15510 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15520 65 6c 28 76 2c 20 69 50 61 72 74 49 64 78 4c 61  el(v, iPartIdxLa
15530 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  bel);.  sqlite3V
15540 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15550 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
15560 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  1+1);.  sqlite3V
15570 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
15580 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d  ddr1);.  if( mem
15590 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c  RootPage<0 ) sql
155a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
155b0 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
155c0 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
155d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
155e0 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64  P_OpenWrite, iId
155f0 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20  x, tnum, iDb, . 
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c     (char *)pKey,
15620 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
15630 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
15640 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55  eP5(v, OPFLAG_BU
15650 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50  LKCSR|((memRootP
15660 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50  age>=0)?OPFLAG_P
15670 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61  2ISREG:0));..  a
15680 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
15690 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
156a0 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74  orterSort, iSort
156b0 65 72 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  er, 0);.  assert
156c0 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d  ( pKey!=0 || db-
156d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
156e0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b   pParse->nErr );
156f0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
15700 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
15710 26 26 20 70 4b 65 79 21 3d 30 20 29 7b 0a 20 20  && pKey!=0 ){.  
15720 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74    int j2 = sqlit
15730 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15740 72 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71  r(v) + 3;.    sq
15750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15760 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a  v, OP_Goto, 0, j
15770 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  2);.    addr2 = 
15780 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
15790 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
157a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
157b0 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Int(v, OP_Sorter
157c0 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72  Compare, iSorter
157d0 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c  , j2, regRecord,
157e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
157f0 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e            pKey->
15800 6e 46 69 65 6c 64 20 2d 20 70 49 6e 64 65 78 2d  nField - pIndex-
15810 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20 73  >nKeyCol);.    s
15820 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
15830 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f  traint(pParse, O
15840 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29  E_Abort, pIndex)
15850 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
15860 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
15870 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15880 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
15890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
158a0 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72  SorterData, iSor
158b0 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
158c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
158d0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp3(v, OP_IdxIn
158e0 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52  sert, iIdx, regR
158f0 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c  ecord, 1);.  sql
15900 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
15910 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
15920 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
15930 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15940 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
15950 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
15960 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15970 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f  _SorterNext, iSo
15980 72 74 65 72 2c 20 61 64 64 72 32 29 3b 0a 20 20  rter, addr2);.  
15990 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
159a0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
159b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
159c0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
159d0 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65   iTab);.  sqlite
159e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
159f0 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a  P_Close, iIdx);.
15a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15a10 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
15a20 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a   iSorter);.}../*
15a30 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65 61  .** Allocate hea
15a40 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  p space to hold 
15a50 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  an Index object 
15a60 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e  with nCol column
15a70 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  s..**.** Increas
15a80 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
15a90 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64 65   size to provide
15aa0 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72 61   an extra nExtra
15ab0 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62   bytes.** of 8-b
15ac0 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61 63  yte aligned spac
15ad0 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
15ae0 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  x object and ret
15af0 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72  urn a.** pointer
15b00 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20 73   to this extra s
15b10 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72 61  pace in *ppExtra
15b20 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
15b30 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
15b40 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74 65  Object(.  sqlite
15b50 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
15b60 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
15b70 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e  ction */.  i16 n
15b80 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
15b90 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
15ba0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
15bb0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
15bc0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
15bd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
15be0 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73 70  ytes of extra sp
15bf0 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a  ace to alloc */.
15c00 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72 61    char **ppExtra
15c10 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
15c20 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61 22  r to the "extra"
15c30 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49   space */.){.  I
15c40 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20  ndex *p;        
15c50 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
15c60 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
15c70 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
15c80 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
15c90 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49 6e   of space for In
15ca0 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72 72  dex object + arr
15cb0 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20  ays */..  nByte 
15cc0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
15cd0 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20  Index)) +       
15ce0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
15cf0 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
15d00 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73          ROUND8(s
15d10 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f  izeof(char*)*nCo
15d20 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  l) +         /* 
15d30 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20  Index.azColl    
15d40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f   */.          RO
15d50 55 4e 44 38 28 73 69 7a 65 6f 66 28 74 52 6f 77  UND8(sizeof(tRow
15d60 63 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  cnt)*(nCol+1) + 
15d70 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f     /* Index.aiRo
15d80 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  wEst   */.      
15d90 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
15da0 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20  f(i16)*nCol +   
15db0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15dc0 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c   sizeof(u8)*nCol
15df0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
15e00 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
15e10 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  er */.  p = sqli
15e20 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
15e30 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74  db, nByte + nExt
15e40 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ra);.  if( p ){.
15e50 20 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61      char *pExtra
15e60 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f   = ((char*)p)+RO
15e70 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
15e80 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f  x));.    p->azCo
15e90 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 70 45 78  ll = (char**)pEx
15ea0 74 72 61 3b 20 20 20 20 20 20 70 45 78 74 72 61  tra;      pExtra
15eb0 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
15ec0 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a  f(char*)*nCol);.
15ed0 20 20 20 20 70 2d 3e 61 69 52 6f 77 45 73 74 20      p->aiRowEst 
15ee0 3d 20 28 74 52 6f 77 63 6e 74 2a 29 70 45 78 74  = (tRowcnt*)pExt
15ef0 72 61 3b 20 20 70 45 78 74 72 61 20 2b 3d 20 73  ra;  pExtra += s
15f00 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 28  izeof(tRowcnt)*(
15f10 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e  nCol+1);.    p->
15f20 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
15f30 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 70 45  )pExtra;      pE
15f40 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69  xtra += sizeof(i
15f50 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  16)*nCol;.    p-
15f60 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
15f70 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70  8*)pExtra;.    p
15f80 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c  ->nColumn = nCol
15f90 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c  ;.    p->nKeyCol
15fa0 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20   = nCol - 1;.   
15fb0 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63 68   *ppExtra = ((ch
15fc0 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a  ar*)p) + nByte;.
15fd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
15fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
15ff0 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20  a new index for 
16000 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70  an SQL table.  p
16010 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20  Name1.pName2 is 
16020 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
16030 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54  index .** and pT
16040 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61  blList is the na
16050 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
16060 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
16070 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c  dexed.  Both wil
16080 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f  l .** be NULL fo
16090 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  r a primary key 
160a0 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  or an index that
160b0 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73   is created to s
160c0 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51  atisfy a.** UNIQ
160d0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
160e0 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49  If pTable and pI
160f0 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75  ndex are NULL, u
16100 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
16110 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74  able.** as the t
16120 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
16130 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  ed.  pParse->pNe
16140 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c  wTable is a tabl
16150 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72  e that is.** cur
16160 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
16170 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52  structed by a CR
16180 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
16190 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73  ment..**.** pLis
161a0 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63  t is a list of c
161b0 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
161c0 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c  exed.  pList wil
161d0 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69  l be NULL if thi
161e0 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72  s.** is a primar
161f0 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d  y key or unique-
16200 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68  constraint on th
16210 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f  e most recent co
16220 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f  lumn added.** to
16230 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
16240 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
16250 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  ruction.  .**.**
16260 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   If the index is
16270 20 63 72 65 61 74 65 64 20 73 75 63 63 65 73 73   created success
16280 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61 20  fully, return a 
16290 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
162a0 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75  ew Index.** stru
162b0 63 74 75 72 65 2e 20 54 68 69 73 20 69 73 20 75  cture. This is u
162c0 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 41 64  sed by sqlite3Ad
162d0 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20 74 6f  dPrimaryKey() to
162e0 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65 78 0a   mark the index.
162f0 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 73  ** as the tables
16300 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 49 6e   primary key (In
16310 64 65 78 2e 61 75 74 6f 49 6e 64 65 78 3d 3d 32  dex.autoIndex==2
16320 29 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  )..*/.Index *sql
16330 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
16340 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16350 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  ,     /* All inf
16360 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
16370 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
16380 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
16390 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
163a0 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
163b0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
163c0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
163d0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
163e0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
163f0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
16400 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e    SrcList *pTblN
16410 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f  ame, /* Table to
16420 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72   index. Use pPar
16430 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
16440 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74   0 */.  ExprList
16450 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
16460 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
16470 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
16480 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
16490 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72        /* OE_Abor
164a0 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
164b0 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
164c0 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
164d0 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
164e0 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
164f0 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69   that begins thi
16500 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
16510 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c   Expr *pPIWhere,
16520 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
16530 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20  use for partial 
16540 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
16550 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20   sortOrder,     
16560 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66  /* Sort order of
16570 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65   primary key whe
16580 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f  n pList==NULL */
16590 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73  .  int ifNotExis
165a0 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72  t     /* Omit er
165b0 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72  ror if index alr
165c0 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
165d0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74 20  {.  Index *pRet 
165e0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  = 0;     /* Poin
165f0 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ter to return */
16600 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
16610 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65   0;     /* Table
16620 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
16630 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
16640 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
16650 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
16660 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
16670 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Name = 0;     /*
16680 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
16690 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ex */.  int nNam
166a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
166b0 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
166c0 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
166d0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44  .  int i, j;.  D
166e0 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
166f0 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
16700 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
16710 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
16720 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
16730 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
16740 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
16750 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
16760 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
16770 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
16780 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
16790 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
167a0 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
167b0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
167c0 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
167d0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
167e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
167f0 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
16800 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
16810 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
16820 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
16830 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
16840 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
16850 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
16860 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
16870 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
16880 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
16890 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
168a0 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
168b0 70 54 61 62 43 6f 6c 3b 20 20 20 20 20 20 20 20  pTabCol;        
168c0 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 69     /* A column i
168d0 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
168e0 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16900 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
16910 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b  ated for zExtra[
16920 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  ] */.  int nExtr
16930 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  aCol;           
16940 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16950 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d  r of extra colum
16960 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63  ns needed */.  c
16970 68 61 72 20 2a 7a 45 78 74 72 61 3b 20 20 20 20  har *zExtra;    
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16990 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61  /* Extra space a
169a0 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
169b0 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78  bject */.  Index
169c0 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20   *pPk = 0;      
169d0 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  /* PRIMARY KEY i
169e0 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
169f0 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
16a00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
16a10 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
16a20 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c      /* Never cal
16a30 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
16a40 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
16a50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16a60 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
16a70 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  AB ){.    goto e
16a80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
16a90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
16aa0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
16ab0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
16ac0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
16ad0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
16ae0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
16af0 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
16b00 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
16b10 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
16b20 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
16b30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
16b40 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
16b50 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
16b60 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
16b70 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
16b80 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
16b90 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
16ba0 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
16bb0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
16bc0 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
16bd0 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
16be0 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
16bf0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
16c00 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
16c10 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
16c20 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
16c30 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
16c40 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
16c50 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
16c60 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
16c70 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
16c80 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20  ssert( pName && 
16c90 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66  pName->z );..#if
16ca0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16cb0 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49  _TEMPDB.    /* I
16cc0 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
16cd0 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
16ce0 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
16cf0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
16d00 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
16d10 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
16d20 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f  base to 1. Do no
16d30 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  t do this.    **
16d40 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67   if initialising
16d50 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
16d60 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ma..    */.    i
16d70 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
16d80 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  y ){.      pTab 
16d90 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
16da0 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
16db0 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TblName);.      
16dc0 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30  if( pName2->n==0
16dd0 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
16de0 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
16df0 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
16e00 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31  .        iDb = 1
16e10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16e20 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69  #endif..    sqli
16e30 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
16e40 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
16e50 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a  index", pName);.
16e60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
16e70 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
16e80 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20   pTblName) ){.  
16e90 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74      /* Because t
16ea0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72  he parser constr
16eb0 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72  ucts pTblName fr
16ec0 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e  om a single iden
16ed0 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a  tifier,.      **
16ee0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
16ef0 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69  st can never fai
16f00 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  l. */.      asse
16f10 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rt(0);.    }.   
16f20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
16f30 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
16f40 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e  Parse, 0, &pTblN
16f50 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20  ame->a[0]);.    
16f60 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
16f70 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70  ocFailed==0 || p
16f80 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab==0 );.    if
16f90 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
16fa0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
16fb0 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d  ex;.    if( iDb=
16fc0 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44  =1 && db->aDb[iD
16fd0 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62  b].pSchema!=pTab
16fe0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
16ff0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17000 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
17010 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
17020 72 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64  reate a TEMP ind
17030 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74  ex on non-TEMP t
17040 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20  able \"%s\"",.  
17050 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
17060 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
17070 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17080 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
17090 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
170a0 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74  b) ) pPk = sqlit
170b0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
170c0 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  x(pTab);.  }else
170d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
170e0 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ame==0 );.    as
170f0 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20  sert( pStart==0 
17100 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
17110 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
17120 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
17130 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17140 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
17150 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
17160 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
17170 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
17180 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
17190 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74  [iDb];..  assert
171a0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
171b0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
171c0 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
171d0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
171e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
171f0 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20  lite_", 7)==0 . 
17200 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
17210 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e  StrNICmp(&pTab->
17220 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74  zName[7],"altert
17230 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20  ab_",9)!=0 ){.  
17240 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17250 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
17260 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
17270 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
17280 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
17290 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
172a0 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
172b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
172c0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
172d0 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
172e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
172f0 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
17300 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
17310 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
17320 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
17330 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
17340 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
17350 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
17360 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
17370 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17380 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
17390 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79  rtual tables may
173a0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
173b0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
173c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
173d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
173e0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
173f0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
17400 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
17410 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
17420 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
17430 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
17440 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
17450 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
17460 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
17470 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
17480 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
17490 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
174a0 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
174b0 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
174c0 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
174d0 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
174e0 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
174f0 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
17500 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
17510 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
17520 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
17530 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
17540 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
17550 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
17560 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
17570 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
17580 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
17590 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
175a0 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
175b0 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
175c0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
175d0 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
175e0 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
175f0 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
17600 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
17610 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
17620 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
17630 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  db, pName);.    
17640 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
17650 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17660 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
17670 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29  t( pName->z!=0 )
17680 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
17690 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
176a0 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
176b0 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
176c0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
176d0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
176e0 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
176f0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
17700 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
17710 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
17720 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
17730 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17740 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
17750 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
17760 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
17770 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
17780 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17790 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
177a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
177b0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
177c0 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
177d0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
177e0 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73    if( !ifNotExis
177f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
17800 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17810 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
17820 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
17830 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  zName);.      }e
17840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
17850 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
17860 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73  usy );.        s
17870 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
17880 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
17890 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
178a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
178b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
178c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
178d0 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
178e0 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
178f0 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
17900 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
17910 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
17920 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e  t, n++){}.    zN
17930 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
17940 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
17950 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64  _autoindex_%s_%d
17960 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
17970 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  n);.    if( zNam
17980 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  e==0 ){.      go
17990 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
179a0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
179b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
179c0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
179d0 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
179e0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
179f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
17a00 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
17a10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
17a20 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20   = pDb->zName;. 
17a30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
17a40 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
17a50 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
17a60 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
17a70 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
17a80 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17a90 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
17aa0 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f  .    i = SQLITE_
17ab0 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20  CREATE_INDEX;.  
17ac0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
17ad0 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69  DB && iDb==1 ) i
17ae0 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
17af0 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
17b00 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
17b10 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c  Check(pParse, i,
17b20 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e   zName, pTab->zN
17b30 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
17b40 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17b50 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
17b60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17b70 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69  * If pList==0, i
17b80 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75  t means this rou
17b90 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20  tine was called 
17ba0 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72  to make a primar
17bb0 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f  y.  ** key out o
17bc0 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  f the last colum
17bd0 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  n added to the t
17be0 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
17bf0 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f  ruction..  ** So
17c00 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c   create a fake l
17c10 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  ist to simulate 
17c20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  this..  */.  if(
17c30 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
17c40 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
17c50 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
17c60 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Parse, 0, 0);.  
17c70 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
17c80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17c90 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69  e_index;.    pLi
17ca0 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  st->a[0].zName =
17cb0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
17cc0 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
17d00 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e  pTab->nCol-1].zN
17d10 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d  ame);.    pList-
17d20 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
17d30 3d 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b  = (u8)sortOrder;
17d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
17d50 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62  e out how many b
17d60 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72  ytes of space ar
17d70 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  e required to st
17d80 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20  ore explicitly. 
17d90 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f   ** specified co
17da0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
17db0 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66   names..  */.  f
17dc0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
17dd0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
17de0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17df0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
17e00 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  r;.    if( pExpr
17e10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17e20 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
17e30 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20  COLLATE );.     
17e40 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20   nExtra += (1 + 
17e50 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
17e60 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
17e70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
17e80 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
17e90 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
17ea0 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
17eb0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
17ec0 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
17ed0 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b   nExtraCol = pPk
17ee0 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20   ? pPk->nKeyCol 
17ef0 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  : 1;.  pIndex = 
17f00 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49  sqlite3AllocateI
17f10 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
17f20 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45  List->nExpr + nE
17f30 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20  xtraCol,.       
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
17f60 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20  Name + nExtra + 
17f70 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69  1, &zExtra);.  i
17f80 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
17f90 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
17fa0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17fb0 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
17fc0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
17fd0 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69  NMENT(pIndex->ai
17fe0 52 6f 77 45 73 74 29 20 29 3b 0a 20 20 61 73 73  RowEst) );.  ass
17ff0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
18000 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78  ALIGNMENT(pIndex
18010 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70  ->azColl) );.  p
18020 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Index->zName = z
18030 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
18040 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20  += nName + 1;.  
18050 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  memcpy(pIndex->z
18060 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
18070 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d  me+1);.  pIndex-
18080 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
18090 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f    pIndex->onErro
180a0 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  r = (u8)onError;
180b0 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e  .  pIndex->uniqN
180c0 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
180d0 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e  !=OE_None;.  pIn
180e0 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d  dex->autoIndex =
180f0 20 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b   (u8)(pName==0);
18100 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
18110 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
18120 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e  ].pSchema;.  pIn
18130 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70  dex->nKeyCol = p
18140 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
18150 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20  f( pPIWhere ){. 
18160 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
18170 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
18180 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
18190 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72  PartIdx, pPIWher
181a0 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65  e, 0);.    pInde
181b0 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
181c0 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20   = pPIWhere;.   
181d0 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20   pPIWhere = 0;. 
181e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
181f0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
18200 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
18210 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
18220 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
18230 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
18240 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
18250 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
18260 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
18270 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
18280 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
18290 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
182a0 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
182b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
182c0 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
182d0 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
182e0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61  */.  }..  /* Sca
182f0 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
18300 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
18310 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
18320 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
18330 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
18340 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
18350 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
18360 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
18370 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
18380 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
18390 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  d..  **.  ** TOD
183a0 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74  O:  Add a test t
183b0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
183c0 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
183d0 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20   is not named.  
183e0 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
183f0 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  e within the sam
18400 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  e index.  Only t
18410 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
18420 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e of.  ** the co
18430 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62  lumn will ever b
18440 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70  e used by the op
18450 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74  timizer.  Note t
18460 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hat using the.  
18470 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d  ** same column m
18480 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61  ore than once ca
18490 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72  nnot be an error
184a0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
184b0 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20  uld .  ** break 
184c0 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
184d0 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65  ibility - it nee
184e0 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69  ds to be a warni
184f0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ng..  */.  for(i
18500 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
18510 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
18520 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
18530 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
18540 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
18550 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
18560 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  >zName;.    int 
18570 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
18580 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  er;.    char *zC
18590 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
185a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
185b0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
185c0 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  e */..    for(j=
185d0 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  0, pTabCol=pTab-
185e0 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
185f0 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f  Col; j++, pTabCo
18600 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
18610 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
18620 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c  ColName, pTabCol
18630 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
18640 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
18650 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
18660 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18670 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18680 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
18690 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
186a0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
186b0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61  b->zName, zColNa
186c0 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  me);.      pPars
186d0 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
186e0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
186f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
18710 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 3d  rt( pTab->nCol<=
18720 30 78 37 66 66 66 20 26 26 20 6a 3c 3d 30 78 37  0x7fff && j<=0x7
18730 66 66 66 20 29 3b 0a 20 20 20 20 70 49 6e 64 65  fff );.    pInde
18740 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
18750 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 69 66 28   (i16)j;.    if(
18760 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
18770 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
18780 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  Coll;.      asse
18790 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  rt( pListItem->p
187a0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
187b0 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 7a 43  LATE );.      zC
187c0 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  oll = pListItem-
187d0 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pExpr->u.zToken
187e0 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20  ;.      nColl = 
187f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18800 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20  zColl) + 1;.    
18810 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
18820 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  >=nColl );.     
18830 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
18840 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20  zColl, nColl);. 
18850 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78       zColl = zEx
18860 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72  tra;.      zExtr
18870 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a += nColl;.    
18880 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c    nExtra -= nCol
18890 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
188a0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
188b0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
188c0 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  .      if( !zCol
188d0 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 49 4e  l ) zColl = "BIN
188e0 41 52 59 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ARY";.    }.    
188f0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
18900 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f  sy && !sqlite3Lo
18910 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
18920 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, zColl) ){.  
18930 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18940 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18950 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  }.    pIndex->az
18960 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b  Coll[i] = zColl;
18970 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f  .    requestedSo
18980 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49  rtOrder = pListI
18990 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26  tem->sortOrder &
189a0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a   sortOrderMask;.
189b0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
189c0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29  tOrder[i] = (u8)
189d0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
189e0 65 72 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  er;.    if( pTab
189f0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c  ->aCol[j].notNul
18a00 6c 3d 3d 30 20 29 20 70 49 6e 64 65 78 2d 3e 75  l==0 ) pIndex->u
18a10 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
18a20 20 20 7d 0a 20 20 69 66 28 20 70 50 6b 20 29 7b    }.  if( pPk ){
18a30 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
18a40 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  pPk->nKeyCol; j+
18a50 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  +){.      int x 
18a60 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
18a70 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61  j];.      if( ha
18a80 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e  sColumn(pIndex->
18a90 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78  aiColumn, pIndex
18aa0 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b  ->nKeyCol, x) ){
18ab0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
18ac0 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20  >nColumn--; .   
18ad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18ae0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
18af0 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20  mn[i] = x;.     
18b00 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
18b10 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f  l[i] = pPk->azCo
18b20 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  ll[j];.        p
18b30 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
18b40 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72  r[i] = pPk->aSor
18b50 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
18b60 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     i++;.      }.
18b70 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18b80 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  ( i==pIndex->nCo
18b90 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  lumn );.  }else{
18ba0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
18bb0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 2d 31 3b 0a 20  olumn[i] = -1;. 
18bc0 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
18bd0 6c 5b 69 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[i] = "BINARY";
18be0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
18bf0 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
18c00 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  ex);.  if( pPars
18c10 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20  e->pNewTable==0 
18c20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57  ) estimateIndexW
18c30 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20  idth(pIndex);.. 
18c40 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
18c50 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
18c60 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
18c70 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ine has been cal
18c80 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  led to create an
18c90 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
18ca0 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73   as a.    ** res
18cb0 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59  ult of a PRIMARY
18cc0 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
18cd0 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d  lause on a colum
18ce0 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72  n definition, or
18cf0 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52  .    ** a PRIMAR
18d00 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
18d10 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67  clause following
18d20 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69   the column defi
18d30 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  nitions..    ** 
18d40 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20  i.e. one of:.   
18d50 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54   **.    ** CREAT
18d60 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d  E TABLE t(x PRIM
18d70 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
18d80 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
18d90 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28   t(x, y, UNIQUE(
18da0 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20  x, y));.    **. 
18db0 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79     ** Either way
18dc0 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
18dd0 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
18de0 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20  ady has such an 
18df0 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a  index. If.    **
18e00 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65   so, don't bothe
18e10 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20  r creating this 
18e20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61  one. This only a
18e30 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a  pplies to.    **
18e40 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
18e50 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20  reated indices. 
18e60 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20  Users can do as 
18e70 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20  they wish with. 
18e80 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69     ** explicit i
18e90 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20  ndices..    **. 
18ea0 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45     ** Two UNIQUE
18eb0 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
18ec0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
18ed0 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76  considered equiv
18ee0 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e  alent.    ** (an
18ef0 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69  d thus suppressi
18f00 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e  ng the second on
18f10 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  e) even if they 
18f20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20  have different. 
18f30 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72     ** sort order
18f40 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
18f50 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
18f60 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  fferent collatin
18f70 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69  g sequences or i
18f80 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
18f90 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73  .    ** the cons
18fa0 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20  traint occur in 
18fb0 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73  different orders
18fc0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
18fd0 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a  raints are.    *
18fe0 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73  * considered dis
18ff0 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72  tinct and both r
19000 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74  esult in separat
19010 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  e indices..    *
19020 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
19030 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
19040 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
19050 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
19060 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
19070 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   k;.      assert
19080 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
19090 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20  =OE_None );.    
190a0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
190b0 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20  autoIndex );.   
190c0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
190d0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
190e0 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  one );..      if
190f0 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21  ( pIdx->nKeyCol!
19100 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  =pIndex->nKeyCol
19110 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
19120 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
19130 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b  dx->nKeyCol; k++
19140 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
19150 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20   char *z1;.     
19160 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19170 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  2;.        if( p
19180 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
19190 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
191a0 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
191b0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78         z1 = pIdx
191c0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
191d0 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78       z2 = pIndex
191e0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
191f0 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20       if( z1!=z2 
19200 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
19210 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61  p(z1, z2) ) brea
19220 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
19230 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b   if( k==pIdx->nK
19240 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
19250 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
19260 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  or!=pIndex->onEr
19270 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ror ){.         
19280 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61   /* This constra
19290 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20  int creates the 
192a0 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20  same index as a 
192b0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
192c0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
192d0 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77   specified somew
192e0 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41  here in the CREA
192f0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
19300 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
19310 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20   However the ON 
19320 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
19330 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
19340 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20  If both this .  
19350 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
19360 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72  raint and the pr
19370 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e  evious equivalen
19380 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76  t constraint hav
19390 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20  e explicit.     
193a0 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c       ** ON CONFL
193b0 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73  ICT clauses this
193c0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74   is an error. Ot
193d0 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
193e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
193f0 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
19400 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20  ed behavior for 
19410 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
19420 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
19430 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e    if( !(pIdx->on
19440 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
19450 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  t || pIndex->onE
19460 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
19470 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
19480 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19490 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
194a0 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c            "confl
194b0 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49  icting ON CONFLI
194c0 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69  CT clauses speci
194d0 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  fied", 0);.     
194e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
194f0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
19500 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
19510 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
19520 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  dx->onError = pI
19530 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20  ndex->onError;. 
19540 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
19560 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19570 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
19580 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e   }.  }..  /* Lin
19590 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
195a0 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
195b0 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
195c0 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
195d0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
195e0 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
195f0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
19600 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
19610 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72  ex *p;.    asser
19620 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
19630 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
19640 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
19650 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
19660 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
19670 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
19680 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
196b0 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  me, sqlite3Strle
196c0 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  n30(pIndex->zNam
196d0 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
196f0 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
19700 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19710 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
19720 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
19730 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
19740 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
19750 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
19760 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19770 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
19780 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
19790 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
197a0 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
197b0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
197c0 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
197d0 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
197e0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
197f0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
19800 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45  e initial CREATE
19810 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
19820 20 28 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c   (or CREATE TABL
19830 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e  E if the.  ** in
19840 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65  dex is an implie
19850 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e  d index for a UN
19860 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
19870 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  KEY constraint) 
19880 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63  then.  ** emit c
19890 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ode to allocate 
198a0 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61  the index rootpa
198b0 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d  ge on disk and m
198c0 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
198d0 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  .  ** the index 
198e0 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
198f0 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70  ster table and p
19900 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65  opulate the inde
19910 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74  x with.  ** cont
19920 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f  ent.  But, do no
19930 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20  t do this if we 
19940 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69  are simply readi
19950 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
19960 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
19970 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68  to parse the sch
19980 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20  ema, or if this 
19990 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49  index is the PRI
199a0 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
199b0 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54   ** of a WITHOUT
199c0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20   ROWID table..  
199d0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
199e0 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
199f0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
19a00 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d  nerated as an im
19a10 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45  plied PRIMARY KE
19a20 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45  Y.  ** or UNIQUE
19a30 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41   index in a CREA
19a40 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
19a50 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
19a60 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
19a70 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
19a80 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
19a90 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
19aa0 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
19ab0 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
19ac0 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
19ad0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72  .  else if( pPar
19ae0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28  se->nErr==0 && (
19af0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
19b00 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 29 20 29  | pTblName!=0) )
19b10 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  {.    Vdbe *v;. 
19b20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
19b30 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b      int iMem = +
19b40 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a  +pParse->nMem;..
19b50 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
19b60 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
19b70 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
19b80 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19b90 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20  index;...    /* 
19ba0 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
19bb0 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
19bc0 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
19bd0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
19be0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
19bf0 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
19c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19c10 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
19c20 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20  , iDb, iMem);.. 
19c30 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
19c40 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
19c50 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
19c60 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
19c70 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
19c80 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
19c90 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
19ca0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
19cb0 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d   = (int)(pParse-
19cc0 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20  >sLastToken.z - 
19cd0 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72  pName->z) + pPar
19ce0 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e  se->sLastToken.n
19cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
19d00 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29  e->z[n-1]==';' )
19d10 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41   n--;.      /* A
19d20 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
19d30 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
19d40 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
19d50 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
19d60 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
19d70 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
19d80 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
19d90 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d          onError=
19da0 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20  =OE_None ? "" : 
19db0 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e  " UNIQUE", n, pN
19dc0 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
19dd0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
19de0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
19df0 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
19e00 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
19e10 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
19e20 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
19e30 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
19e40 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
19e50 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
19e60 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
19e70 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
19e80 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
19e90 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
19ea0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
19eb0 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
19ec0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
19ed0 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
19ee0 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
19ef0 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
19f00 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
19f10 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
19f20 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49  iDb),.        pI
19f30 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
19f40 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
19f50 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a  ,.        iMem,.
19f60 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
19f70 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
19f80 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
19f90 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
19fa0 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
19fb0 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
19fc0 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
19fd0 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
19fe0 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
19ff0 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
1a000 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
1a010 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1a020 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
1a030 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1a040 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1a050 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
1a060 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1a070 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1a080 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a090 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
1a0a0 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
1a0b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
1a0c0 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27  intf(db, "name='
1a0d0 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  %q' AND type='in
1a0e0 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  dex'", pIndex->z
1a0f0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
1a100 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1a110 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29  v, OP_Expire, 0)
1a120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a130 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
1a140 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
1a150 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
1a160 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
1a170 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
1a180 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
1a190 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
1a1a0 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
1a1b0 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
1a1c0 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
1a1d0 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
1a1e0 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61   correct constra
1a1f0 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70  int check.  ** p
1a200 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71  rocessing (in sq
1a210 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
1a220 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29  straintChecks())
1a230 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a   as part of.  **
1a240 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45   UPDATE and INSE
1a250 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  RT statements.  
1a260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
1a270 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
1a280 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
1a290 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
1a2a0 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
1a2b0 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
1a2c0 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
1a2d0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1a2e0 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
1a2f0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1a300 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1a310 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
1a320 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1a330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
1a340 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
1a350 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1a360 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
1a370 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
1a380 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
1a390 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
1a3a0 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
1a3b0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
1a3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1a3d0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
1a3e0 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
1a3f0 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
1a400 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
1a410 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65      pRet = pInde
1a420 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20  x;.    pIndex = 
1a430 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  0;.  }..  /* Cle
1a440 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
1a450 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
1a460 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28  ate_index:.  if(
1a470 20 70 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e   pIndex ) freeIn
1a480 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
1a490 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1a4a0 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72  lete(db, pPIWher
1a4b0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
1a4c0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1a4d0 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
1a4e0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1a4f0 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  b, pTblName);.  
1a500 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1a510 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
1a520 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
1a530 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
1a540 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
1a550 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
1a560 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
1a570 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
1a580 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
1a590 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
1a5a0 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
1a5b0 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
1a5c0 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f  0] is suppose to
1a5d0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1a5e0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1a5f0 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
1a600 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
1a610 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
1a620 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
1a630 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
1a640 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
1a650 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1a660 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
1a670 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1a680 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
1a690 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
1a6a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1a6b0 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
1a6c0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1a6d0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
1a6e0 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
1a6f0 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
1a700 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68  mbiniation of th
1a710 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e  e first 2 column
1a720 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65  s.** of the inde
1a730 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  x.  And so forth
1a740 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79  .  It must alway
1a750 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  s be the case th
1a760 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  at.*.**         
1a770 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61    aiRowEst[N]<=a
1a780 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20  iRowEst[N-1].** 
1a790 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
1a7a0 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41  st[N]>=1.**.** A
1a7b0 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20  part from that, 
1a7c0 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74  we have little t
1a7d0 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20  o go on besides 
1a7e0 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a  intuition as to.
1a7f0 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b  ** how aiRowEst[
1a800 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  ] should be init
1a810 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75  ialized.  The nu
1a820 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20  mbers generated 
1a830 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65  here.** are base
1a840 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c  d on typical val
1a850 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74  ues found in act
1a860 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a  ual indices..*/.
1a870 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61  void sqlite3Defa
1a880 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20  ultRowEst(Index 
1a890 2a 70 49 64 78 29 7b 0a 20 20 74 52 6f 77 63 6e  *pIdx){.  tRowcn
1a8a0 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52  t *a = pIdx->aiR
1a8b0 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  owEst;.  int i;.
1a8c0 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 61    tRowcnt n;.  a
1a8d0 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20  ssert( a!=0 );. 
1a8e0 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54   a[0] = pIdx->pT
1a8f0 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20  able->nRowEst;. 
1a900 20 69 66 28 20 61 5b 30 5d 3c 31 30 20 29 20 61   if( a[0]<10 ) a
1a910 5b 30 5d 20 3d 20 31 30 3b 0a 20 20 6e 20 3d 20  [0] = 10;.  n = 
1a920 31 30 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  10;.  for(i=1; i
1a930 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  <=pIdx->nKeyCol;
1a940 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20   i++){.    a[i] 
1a950 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e 35  = n;.    if( n>5
1a960 20 29 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66   ) n--;.  }.  if
1a970 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
1a980 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
1a990 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d  a[pIdx->nKeyCol]
1a9a0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
1a9b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a9c0 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
1a9d0 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
1a9e0 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
1a9f0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
1aa00 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
1aa10 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
1aa20 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
1aa30 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
1aa40 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
1aa50 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
1aa60 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1aa70 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
1aa80 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1aa90 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
1aaa0 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  b;..  assert( pP
1aab0 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
1aac0 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
1aad0 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72  ed with prior er
1aae0 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  rors */.  if( db
1aaf0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1ab00 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1ab10 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1ab20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
1ab30 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
1ab40 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1ab50 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1ab60 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
1ab70 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1ab80 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
1ab90 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
1aba0 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
1abb0 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
1abc0 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
1abd0 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
1abe0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69  =0 ){.    if( !i
1abf0 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  fExists ){.     
1ac00 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1ac10 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1ac20 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
1ac30 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ame, 0);.    }el
1ac40 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1ac50 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
1ac60 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
1ac70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
1ac80 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  base);.    }.   
1ac90 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
1aca0 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
1acb0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1acc0 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
1acd0 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  ndex->autoIndex 
1ace0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1acf0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1ad00 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1ad10 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
1ad20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
1ad30 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1ad40 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1ad50 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
1ad60 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1ad70 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
1ad80 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1ad90 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
1ada0 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66  Schema);.#ifndef
1adb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1adc0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
1add0 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
1ade0 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
1adf0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1ae00 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
1ae10 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1ae20 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
1ae30 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
1ae40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1ae50 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
1ae60 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
1ae70 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1ae80 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
1ae90 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
1aea0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1aeb0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1aec0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1aed0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1aee0 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
1aef0 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
1af00 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
1af10 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1af20 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
1af30 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
1af40 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
1af50 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1af60 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1af70 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1af80 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1af90 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
1afa0 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
1afb0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
1afc0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1afd0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1afe0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1aff0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1b000 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1b010 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
1b020 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1b030 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
1b040 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1b050 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
1b060 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  =%Q AND type='in
1b070 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62  dex'",.       db
1b080 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1b090 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
1b0a0 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  Db), pIndex->zNa
1b0b0 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  me.    );.    sq
1b0c0 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
1b0d0 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
1b0e0 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d  , "idx", pIndex-
1b0f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1b100 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
1b110 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1b120 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
1b130 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ge(pParse, pInde
1b140 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
1b150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b160 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49  dOp4(v, OP_DropI
1b170 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c  ndex, iDb, 0, 0,
1b180 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1b190 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  0);.  }..exit_dr
1b1a0 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
1b1b0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1b1c0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
1b1d0 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20  /*.** pArray is 
1b1e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1b1f0 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
1b200 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  . Each object in
1b210 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73   the.** array is
1b220 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69   szEntry bytes i
1b230 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75  n size. This rou
1b240 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65  tine uses sqlite
1b250 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20  3DbRealloc().** 
1b260 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72  to extend the ar
1b270 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72  ray so that ther
1b280 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61  e is space for a
1b290 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74   new object at t
1b2a0 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  he end..**.** Wh
1b2b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1b2c0 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45   is called, *pnE
1b2d0 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntry contains th
1b2e0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1b2f0 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28  f.** the array (
1b300 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20  in entries - so 
1b310 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  the allocation i
1b320 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20  s ((*pnEntry) * 
1b330 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a  szEntry) bytes.*
1b340 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a  * in total)..**.
1b350 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f  ** If the reallo
1b360 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75  c() is successfu
1b370 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f  l (i.e. if no OO
1b380 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75  M condition occu
1b390 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63  rs), the.** spac
1b3a0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
1b3b0 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1b3c0 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74  s zeroed, *pnEnt
1b3d0 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a  ry updated to.**
1b3e0 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
1b3f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
1b400 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ay and a pointer
1b410 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   to the new allo
1b420 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  cation.** return
1b430 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74  ed. *pIdx is set
1b440 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1b450 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65   the new array e
1b460 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73  ntry in this cas
1b470 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
1b480 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c  se, if the reall
1b490 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64  oc() fails, *pId
1b4a0 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20  x is set to -1, 
1b4b0 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73  *pnEntry remains
1b4c0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  .** unchanged an
1b4d0 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72  d a copy of pArr
1b4e0 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ay returned..*/.
1b4f0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72  void *sqlite3Arr
1b500 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71  ayAllocate(.  sq
1b510 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1b520 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
1b530 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
1b540 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
1b550 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20  void *pArray,   
1b560 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62    /* Array of ob
1b570 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65  jects.  Might be
1b580 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a   reallocated */.
1b590 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20    int szEntry,  
1b5a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65      /* Size of e
1b5b0 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1b5c0 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  e array */.  int
1b5d0 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
1b5e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
1b5f0 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
1b600 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
1b610 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Idx         /* W
1b620 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  rite the index o
1b630 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72  f a new slot her
1b640 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  e */.){.  char *
1b650 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e  z;.  int n = *pn
1b660 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20  Entry;.  if( (n 
1b670 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20  & (n-1))==0 ){. 
1b680 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d     int sz = (n==
1b690 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20  0) ? 1 : 2*n;.  
1b6a0 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73    void *pNew = s
1b6b0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1b6c0 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73  db, pArray, sz*s
1b6d0 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
1b6e0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1b6f0 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
1b700 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
1b710 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  y;.    }.    pAr
1b720 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ray = pNew;.  }.
1b730 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72    z = (char*)pAr
1b740 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a  ray;.  memset(&z
1b750 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30  [n * szEntry], 0
1b760 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70  , szEntry);.  *p
1b770 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e  Idx = n;.  ++*pn
1b780 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20  Entry;.  return 
1b790 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pArray;.}../*.**
1b7a0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
1b7b0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
1b7c0 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
1b7d0 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
1b7e0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
1b7f0 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
1b800 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
1b810 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
1b820 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
1b830 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
1b840 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33  stAppend(sqlite3
1b850 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
1b860 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
1b870 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  en){.  int i;.  
1b880 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
1b890 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
1b8a0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1b8b0 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  db, sizeof(IdLis
1b8c0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
1b8d0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
1b8e0 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
1b8f0 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  a = sqlite3Array
1b900 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
1b910 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d  db,.      pList-
1b920 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  >a,.      sizeof
1b930 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20  (pList->a[0]),. 
1b940 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64       &pList->nId
1b950 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  ,.      &i.  );.
1b960 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
1b970 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1b980 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
1b990 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1b9a0 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   }.  pList->a[i]
1b9b0 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
1b9c0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1b9d0 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74  , pToken);.  ret
1b9e0 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
1b9f0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
1ba00 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
1ba10 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1ba20 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  e(sqlite3 *db, I
1ba30 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  dList *pList){. 
1ba40 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1ba50 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1ba60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1ba70 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1ba80 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1ba90 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  e(db, pList->a[i
1baa0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
1bab0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1bac0 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
1bad0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1bae0 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
1baf0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1bb00 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
1bb10 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
1bb20 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
1bb30 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
1bb40 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
1bb50 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
1bb60 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
1bb70 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
1bb80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1bb90 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1bba0 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
1bbb0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1bbc0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1bbd0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
1bbe0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
1bbf0 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
1bc00 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
1bc10 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
1bc20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65  Expand the space
1bc30 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
1bc40 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
1bc50 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72   object by.** cr
1bc60 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65  eating nExtra ne
1bc70 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e  w slots beginnin
1bc80 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53  g at iStart.  iS
1bc90 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73  tart is zero bas
1bca0 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73  ed..** New slots
1bcb0 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
1bcc0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1bcd0 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73  suppose a SrcLis
1bce0 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74  t initially cont
1bcf0 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73  ains two entries
1bd00 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70  : A,B..** To app
1bd10 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65  end 3 new entrie
1bd20 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20  s onto the end, 
1bd30 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  do this:.**.**  
1bd40 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1bd50 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1bd60 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a  list, 3, 2);.**.
1bd70 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c  ** After the cal
1bd80 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64  l above it would
1bd90 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c   contain:  A, B,
1bda0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a   nil, nil, nil..
1bdb0 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74  ** If the iStart
1bdc0 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65   argument had be
1bdd0 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20  en 1 instead of 
1bde0 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  2, then the resu
1bdf0 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65  lt.** would have
1be00 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20   been:  A, nil, 
1be10 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f  nil, nil, B.  To
1be20 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77   prepend the new
1be30 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69   slots,.** the i
1be40 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c  Start value woul
1be50 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73  d be 0.  The res
1be60 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a  ult then would.*
1be70 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20  * be: nil, nil, 
1be80 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a  nil, A, B..**.**
1be90 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
1bea0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68  ocation fails th
1beb0 65 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63  e SrcList is unc
1bec0 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20  hanged.  The.** 
1bed0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1bee0 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65   flag will be se
1bef0 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72  t to true..*/.Sr
1bf00 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1bf10 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20  cListEnlarge(.  
1bf20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1bf30 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1bf40 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1bf50 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72  ify of OOM error
1bf60 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
1bf70 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65  pSrc,     /* The
1bf80 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65   SrcList to be e
1bf90 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74  nlarged */.  int
1bfa0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
1bfb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77  /* Number of new
1bfc0 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f   slots to add to
1bfd0 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20   pSrc->a[] */.  
1bfe0 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20  int iStart      
1bff0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1c000 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73  Src->a[] of firs
1c010 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b  t new slot */.){
1c020 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
1c030 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
1c040 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d  on calling param
1c050 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
1c060 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a  t( iStart>=0 );.
1c070 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
1c080 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1c090 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73   pSrc!=0 );.  as
1c0a0 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53  sert( iStart<=pS
1c0b0 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f  rc->nSrc );..  /
1c0c0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74  * Allocate addit
1c0d0 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e  ional space if n
1c0e0 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  eeded */.  if( p
1c0f0 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
1c100 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  >pSrc->nAlloc ){
1c110 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  .    SrcList *pN
1c120 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c  ew;.    int nAll
1c130 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b  oc = pSrc->nSrc+
1c140 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20  nExtra;.    int 
1c150 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d  nGot;.    pNew =
1c160 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1c170 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20  c(db, pSrc,.    
1c180 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
1c190 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c  f(*pSrc) + (nAll
1c1a0 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72  oc-1)*sizeof(pSr
1c1b0 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  c->a[0]) );.    
1c1c0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1c1d0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
1c1e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1c1f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53  .      return pS
1c200 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  rc;.    }.    pS
1c210 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e  rc = pNew;.    n
1c220 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62  Got = (sqlite3Db
1c230 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70  MallocSize(db, p
1c240 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70  New) - sizeof(*p
1c250 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72  Src))/sizeof(pSr
1c260 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20  c->a[0])+1;.    
1c270 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  pSrc->nAlloc = (
1c280 75 38 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20  u8)nGot;.  }..  
1c290 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67  /* Move existing
1c2a0 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65   slots that come
1c2b0 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79   after the newly
1c2c0 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a   inserted slots.
1c2d0 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
1c2e0 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  way */.  for(i=p
1c2f0 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  Src->nSrc-1; i>=
1c300 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20  iStart; i--){.  
1c310 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74    pSrc->a[i+nExt
1c320 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ra] = pSrc->a[i]
1c330 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53  ;.  }.  pSrc->nS
1c340 72 63 20 2b 3d 20 28 69 38 29 6e 45 78 74 72 61  rc += (i8)nExtra
1c350 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
1c360 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
1c370 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73   slots */.  mems
1c380 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61  et(&pSrc->a[iSta
1c390 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rt], 0, sizeof(p
1c3a0 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72  Src->a[0])*nExtr
1c3b0 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61  a);.  for(i=iSta
1c3c0 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78  rt; i<iStart+nEx
1c3d0 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  tra; i++){.    p
1c3e0 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
1c3f0 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  r = -1;.  }..  /
1c400 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1c410 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67  er to the enlarg
1c420 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ed SrcList */.  
1c430 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a  return pSrc;.}..
1c440 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1c450 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
1c460 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
1c470 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1c480 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
1c490 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
1c4a0 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
1c4b0 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
1c4c0 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20   even if pTable 
1c4d0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
1c4e0 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
1c4f0 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
1c500 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d   there is an OOM
1c510 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74   error.  The ret
1c520 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74  urned.** SrcList
1c530 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61   might be the sa
1c540 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73  me as the SrcLis
1c550 74 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74  t that was input
1c560 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a   or it might be.
1c570 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49  ** a new one.  I
1c580 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64  f an OOM error d
1c590 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  oes occurs, then
1c5a0 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65   the prior value
1c5b0 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61   of pList.** tha
1c5c0 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68  t is input to th
1c5d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75  is routine is au
1c5e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65  tomatically free
1c5f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  d..**.** If pDat
1c600 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
1c610 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1c620 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
1c630 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
1c640 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
1c650 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
1c660 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
1c670 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
1c680 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
1c690 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
1c6a0 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
1c6b0 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
1c6c0 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
1c6d0 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
1c6e0 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
1c6f0 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
1c700 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
1c710 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
1c720 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
1c730 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
1c740 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
1c750 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
1c760 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
1c770 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
1c780 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
1c790 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
1c7a0 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
1c7b0 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
1c7c0 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
1c7d0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
1c7e0 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
1c7f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1c800 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1c810 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  nd(D,A,B,0);.**.
1c820 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
1c830 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
1c840 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1c850 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
1c860 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
1c870 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1c880 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1c890 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1c8a0 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
1c8b0 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
1c8c0 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
1c8d0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
1c8e0 20 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65    If C is define
1c8f0 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20  d.** then so is 
1c900 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  B.  In other wor
1c910 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76  ds, we never hav
1c920 65 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a  e a case where:.
1c930 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1c940 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1c950 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,0,C);.**.
1c960 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61  ** Both pTable a
1c970 6e 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65  nd pDatabase are
1c980 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71   assumed to be q
1c990 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65  uoted.  They are
1c9a0 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66   dequoted.** bef
1c9b0 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20  ore being added 
1c9c0 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a  to the SrcList..
1c9d0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1c9e0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1c9f0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1ca00 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
1ca10 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1ca20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1ca30 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  es */.  SrcList 
1ca40 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
1ca50 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
1ca60 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
1ca70 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
1ca80 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
1ca90 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
1caa0 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
1cab0 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
1cac0 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
1cad0 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
1cae0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
1caf0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1cb00 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  em;.  assert( pD
1cb10 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54  atabase==0 || pT
1cb20 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43  able!=0 );  /* C
1cb30 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74  annot have C wit
1cb40 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28 20  hout B */.  if( 
1cb50 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1cb60 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1cb70 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1cb80 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
1cb90 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1cba0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1cbb0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
1cbc0 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69  c = 1;.  }.  pLi
1cbd0 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  st = sqlite3SrcL
1cbe0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1cbf0 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e  List, 1, pList->
1cc00 6e 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  nSrc);.  if( db-
1cc10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1cc20 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
1cc30 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1cc40 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1cc50 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20   0;.  }.  pItem 
1cc60 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
1cc70 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  t->nSrc-1];.  if
1cc80 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
1cc90 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
1cca0 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
1ccb0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
1ccc0 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20  Database ){.    
1ccd0 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70  Token *pTemp = p
1cce0 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44  Database;.    pD
1ccf0 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65  atabase = pTable
1cd00 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70  ;.    pTable = p
1cd10 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65  Temp;.  }.  pIte
1cd20 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
1cd30 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1cd40 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70  db, pTable);.  p
1cd50 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
1cd60 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1cd70 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61  mToken(db, pData
1cd80 62 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  base);.  return 
1cd90 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
1cda0 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f  Assign VdbeCurso
1cdb0 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20  r index numbers 
1cdc0 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
1cdd0 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
1cde0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1cdf0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
1ce00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1ce10 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1ce20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1ce30 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ce40 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70  Item;.  assert(p
1ce50 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e  List || pParse->
1ce60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ce70 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
1ce80 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ){.    for(i=0, 
1ce90 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
1cea0 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
1ceb0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1cec0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
1ced0 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61  Cursor>=0 ) brea
1cee0 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  k;.      pItem->
1cef0 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  iCursor = pParse
1cf00 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
1cf10 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
1cf20 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
1cf30 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
1cf40 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
1cf50 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1cf60 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d  ->pSrc);.      }
1cf70 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1cf80 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
1cf90 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
1cfa0 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
1cfb0 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
1cfc0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1cfd0 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
1cfe0 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
1cff0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1d000 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1d010 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1d020 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1d030 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49  return;.  for(pI
1d040 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1d050 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
1d060 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1d070 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1d080 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44  ee(db, pItem->zD
1d090 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
1d0a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d0b0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1d0c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1d0d0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  (db, pItem->zAli
1d0e0 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  as);.    sqlite3
1d0f0 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
1d100 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ->zIndex);.    s
1d110 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
1d120 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61  e(db, pItem->pTa
1d130 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
1d140 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1d150 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
1d160 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1d170 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1d180 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
1d190 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1d1a0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  db, pItem->pUsin
1d1b0 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
1d1c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1d1d0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
1d1e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1d1f0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1d200 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
1d210 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
1d220 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
1d230 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
1d240 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1d250 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
1d260 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d270 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1d280 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
1d290 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
1d2a0 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
1d2b0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
1d2c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d2d0 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
1d2e0 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
1d2f0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1d300 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
1d310 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
1d320 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
1d330 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
1d340 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
1d350 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
1d360 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
1d370 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
1d380 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
1d390 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74  m has a alias, t
1d3a0 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
1d3b0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
1d3c0 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
1d3d0 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
1d3e0 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
1d3f0 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
1d400 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
1d410 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
1d420 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
1d430 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
1d440 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
1d450 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
1d460 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
1d470 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
1d480 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
1d490 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1d4a0 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
1d4b0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1d4c0 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
1d4d0 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
1d4e0 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
1d4f0 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
1d500 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
1d510 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1d520 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
1d530 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
1d540 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
1d550 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1d560 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1d570 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1d580 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
1d590 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1d5a0 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
1d5b0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
1d5c0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1d5d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
1d5e0 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
1d5f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1d600 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
1d610 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
1d620 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d630 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
1d640 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
1d650 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
1d660 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
1d670 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
1d680 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
1d690 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1d6a0 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
1d6b0 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
1d6c0 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
1d6d0 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
1d6e0 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
1d6f0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
1d700 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
1d710 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
1d720 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
1d730 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
1d740 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
1d750 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1d760 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1d770 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1d780 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1d790 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70   !p && (pOn || p
1d7a0 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71  Using) ){.    sq
1d7b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1d7c0 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c  arse, "a JOIN cl
1d7d0 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
1d7e0 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20   before %s", .  
1d7f0 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20      (pOn ? "ON" 
1d800 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29  : "USING").    )
1d810 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  ;.    goto appen
1d820 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1d830 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53  }.  p = sqlite3S
1d840 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
1d850 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74   p, pTable, pDat
1d860 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  abase);.  if( p=
1d870 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
1d880 53 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67  Src==0) ){.    g
1d890 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
1d8a0 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74  error;.  }.  pIt
1d8b0 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
1d8c0 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  rc-1];.  assert(
1d8d0 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20   pAlias!=0 );.  
1d8e0 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b  if( pAlias->n ){
1d8f0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  .    pItem->zAli
1d900 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
1d910 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41  FromToken(db, pA
1d920 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74  lias);.  }.  pIt
1d930 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  em->pSelect = pS
1d940 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d  ubquery;.  pItem
1d950 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70  ->pOn = pOn;.  p
1d960 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70  Item->pUsing = p
1d970 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20  Using;.  return 
1d980 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d  p;.. append_from
1d990 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74  _error:.  assert
1d9a0 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( p==0 );.  sqli
1d9b0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1d9c0 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65  , pOn);.  sqlite
1d9d0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1d9e0 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c  , pUsing);.  sql
1d9f0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1da00 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b  (db, pSubquery);
1da10 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1da20 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44  /*.** Add an IND
1da30 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49  EXED BY or NOT I
1da40 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f  NDEXED clause to
1da50 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1da60 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65  ly added .** ele
1da70 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72  ment of the sour
1da80 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  ce-list passed a
1da90 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1daa0 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
1dab0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
1dac0 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50  exedBy(Parse *pP
1dad0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1dae0 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65  , Token *pIndexe
1daf0 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20  dBy){.  assert( 
1db00 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b  pIndexedBy!=0 );
1db10 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57 41  .  if( p && ALWA
1db20 59 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b  YS(p->nSrc>0) ){
1db30 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
1db40 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1db50 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1db60 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
1db70 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65  pItem->notIndexe
1db80 64 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a  d==0 && pItem->z
1db90 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Index==0 );.    
1dba0 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e  if( pIndexedBy->
1dbb0 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65  n==1 && !pIndexe
1dbc0 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  dBy->z ){.      
1dbd0 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45  /* A "NOT INDEXE
1dbe0 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75  D" clause was su
1dbf0 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73  pplied. See pars
1dc00 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  e.y .      ** co
1dc10 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64  nstruct "indexed
1dc20 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c  _opt" for detail
1dc30 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65  s. */.      pIte
1dc40 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  m->notIndexed = 
1dc50 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1dc60 20 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65      pItem->zInde
1dc70 78 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  x = sqlite3NameF
1dc80 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1dc90 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29  >db, pIndexedBy)
1dca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1dcb0 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
1dcc0 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
1dcd0 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
1dce0 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
1dcf0 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
1dd00 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
1dd10 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
1dd20 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
1dd30 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
1dd40 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
1dd50 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
1dd60 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1dd70 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1dd80 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
1dd90 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
1dda0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1ddb0 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
1ddc0 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
1ddd0 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
1dde0 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
1ddf0 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
1de00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
1de10 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
1de20 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
1de30 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
1de40 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
1de50 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
1de60 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
1de70 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
1de80 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
1de90 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
1dea0 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
1deb0 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
1dec0 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
1ded0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
1dee0 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
1def0 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
1df00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1df10 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
1df20 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
1df30 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
1df40 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
1df50 20 70 2d 3e 61 20 7c 7c 20 70 2d 3e 6e 53 72 63   p->a || p->nSrc
1df60 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==0 );.    for(i
1df70 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
1df80 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
1df90 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[i].jointype = 
1dfa0 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79  p->a[i-1].jointy
1dfb0 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
1dfc0 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[0].jointype =
1dfd0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1dfe0 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
1dff0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1e000 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
1e010 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1e020 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
1e030 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e040 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
1e050 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1e060 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
1e070 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
1e080 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1e090 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /*  if( db->aDb[
1e0a0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1e0b0 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  rn; */.  if( sql
1e0c0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1e0d0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1e0e0 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
1e0f0 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
1e100 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
1e110 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1e120 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1e130 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  !v ) return;.  i
1e140 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45  f( type!=TK_DEFE
1e150 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28  RRED ){.    for(
1e160 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1e170 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1e180 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e190 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
1e1a0 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58   i, (type==TK_EX
1e1b0 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20  CLUSIVE)+1);.   
1e1c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
1e1d0 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20  esBtree(v, i);. 
1e1e0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1e1f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e200 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30  OP_AutoCommit, 0
1e210 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
1e220 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
1e230 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1e240 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  te3CommitTransac
1e250 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1e260 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  se){.  Vdbe *v;.
1e270 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1e280 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
1e290 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
1e2a0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1e2b0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1e2c0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1e2d0 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
1e2e0 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
1e2f0 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
1e300 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1e310 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1e320 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1e330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1e340 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
1e350 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
1e360 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1e370 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1e380 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
1e390 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1e3a0 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
1e3b0 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  v;..  assert( pP
1e3c0 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
1e3d0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
1e3e0 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
1e3f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1e400 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1e410 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
1e420 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  CK", 0, 0) ){.  
1e430 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1e440 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1e450 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1e460 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1e470 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e480 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
1e490 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
1e4a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e4b0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1e4c0 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
1e4d0 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
1e4e0 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
1e4f0 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
1e500 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
1e510 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
1e520 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
1e530 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1e540 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
1e550 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
1e560 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1e570 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1e580 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
1e590 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
1e5a0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1e5b0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1e5c0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
1e5d0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1e5e0 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
1e5f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
1e600 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
1e610 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
1e620 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
1e630 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
1e640 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
1e650 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1e660 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
1e670 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
1e680 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
1e690 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
1e6a0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1e6b0 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
1e6c0 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
1e6d0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1e6e0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1e6f0 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
1e700 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1e710 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e720 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
1e730 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
1e740 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
1e750 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
1e760 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1e770 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
1e780 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
1e790 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
1e7a0 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
1e7b0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
1e7c0 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
1e7d0 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
1e7e0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
1e7f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e800 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1e810 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1e820 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1e830 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1e840 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
1e850 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
1e860 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
1e870 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
1e880 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
1e890 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
1e8a0 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
1e8b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1e8c0 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
1e8d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
1e8e0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
1e8f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1e900 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
1e910 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1e920 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1e930 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1e940 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
1e950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1e960 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
1e970 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20  s, 0, db, &pBt, 
1e980 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  0, flags);.    i
1e990 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e9a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e9b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1e9c0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
1e9d0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
1e9e0 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
1e9f0 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
1ea00 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
1ea10 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
1ea20 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
1ea30 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1ea40 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b    }.    db->aDb[
1ea50 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  1].pBt = pBt;.  
1ea60 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1ea70 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
1ea80 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
1ea90 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
1eaa0 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
1eab0 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
1eac0 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20  ize, -1, 0) ){. 
1ead0 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
1eae0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
1eaf0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1eb00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1eb10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1eb20 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
1eb30 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
1eb40 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
1eb50 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72  and start.** a r
1eb60 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1eb70 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61  for all named da
1eb80 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
1eb90 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
1eba0 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68  ant that all sch
1ebb0 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76  ema cookies be v
1ebc0 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a  erified and all.
1ebd0 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ** read transact
1ebe0 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20  ions be started 
1ebf0 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20  before anything 
1ec00 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a  else happens in.
1ec10 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ** the VDBE prog
1ec20 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72  ram.  But this r
1ec30 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
1ec40 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20  lled after much 
1ec50 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61  other.** code ha
1ec60 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  s been generated
1ec70 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68  .  So here is wh
1ec80 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20  at we do:.**.** 
1ec90 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
1eca0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1ecb0 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61  alled, we code a
1ecc0 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a  n OP_Goto that.*
1ecd0 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61  * will jump to a
1ece0 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74   subroutine at t
1ecf0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
1ed00 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a  ogram.  Then we.
1ed10 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20  ** record every 
1ed20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65  database that ne
1ed30 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76  eds its schema v
1ed40 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  erified in the.*
1ed50 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  * pParse->cookie
1ed60 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74  Mask field.  Lat
1ed70 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74  er, after all ot
1ed80 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65  her code has bee
1ed90 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20  n.** generated, 
1eda0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
1edb0 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f  hat does the coo
1edc0 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
1edd0 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20  s and.** starts 
1ede0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  the transactions
1edf0 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61   will be coded a
1ee00 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50  nd the OP_Goto P
1ee10 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
1ee20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
1ee30 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
1ee40 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
1ee50 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
1ee60 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
1ee70 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
1ee80 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
1ee90 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
1eea0 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  g()..**.** If iD
1eeb0 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68  b<0 then code th
1eec0 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d  e OP_Goto only -
1eed0 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20   don't set flag 
1eee0 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a  to verify the.**
1eef0 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64   schema on any d
1ef00 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20  atabases.  This 
1ef10 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70  can be used to p
1ef20 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47  osition the OP_G
1ef30 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20  oto.** early in 
1ef40 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65  the code, before
1ef50 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20   we know if any 
1ef60 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20  database tables 
1ef70 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f  will be used..*/
1ef80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
1ef90 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
1efa0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1efb0 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
1efc0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1efd0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1efe0 28 70 50 61 72 73 65 29 3b 0a 0a 23 69 66 6e 64  (pParse);..#ifnd
1eff0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1f000 52 49 47 47 45 52 0a 20 20 69 66 28 20 70 54 6f  RIGGER.  if( pTo
1f010 70 6c 65 76 65 6c 21 3d 70 50 61 72 73 65 20 29  plevel!=pParse )
1f020 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72  {.    /* This br
1f030 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66  anch is taken if
1f040 20 61 20 74 72 69 67 67 65 72 20 69 73 20 63 75   a trigger is cu
1f050 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
1f060 64 65 64 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  ded. In this.   
1f070 20 2a 2a 20 63 61 73 65 2c 20 73 65 74 20 63 6f   ** case, set co
1f080 6f 6b 69 65 47 6f 74 6f 20 74 6f 20 61 20 6e 6f  okieGoto to a no
1f090 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 74 6f 20  n-zero value to 
1f0a0 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 66  show that this f
1f0b0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  unction.    ** h
1f0c0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 20  as been called. 
1f0d0 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
1f0e0 74 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  the sqlite3ExprC
1f0f0 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 29 0a 20  odeConstants(). 
1f100 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
1f110 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  */.    pParse->c
1f120 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 2d 31 3b 0a  ookieGoto = -1;.
1f130 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
1f140 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
1f150 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20  ieGoto==0 ){.   
1f160 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
1f170 65 33 47 65 74 56 64 62 65 28 70 54 6f 70 6c 65  e3GetVdbe(pTople
1f180 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  vel);.    if( v=
1f190 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
1f1a0 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
1f1b0 6e 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ns if there was 
1f1c0 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f  a prior error */
1f1d0 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  .    pToplevel->
1f1e0 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c  cookieGoto = sql
1f1f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f200 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
1f210 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  +1;.  }.  if( iD
1f220 62 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b>=0 ){.    sqli
1f230 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65  te3 *db = pTople
1f240 76 65 6c 2d 3e 64 62 3b 0a 20 20 20 20 79 44 62  vel->db;.    yDb
1f250 4d 61 73 6b 20 6d 61 73 6b 3b 0a 0a 20 20 20 20  Mask mask;..    
1f260 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
1f270 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nDb );.    asser
1f280 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
1f290 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31  pBt!=0 || iDb==1
1f2a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1f2b0 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41  iDb<SQLITE_MAX_A
1f2c0 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20  TTACHED+2 );.   
1f2d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f2e0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
1f2f0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
1f300 20 20 20 6d 61 73 6b 20 3d 20 28 28 79 44 62 4d     mask = ((yDbM
1f310 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 20  ask)1)<<iDb;.   
1f320 20 69 66 28 20 28 70 54 6f 70 6c 65 76 65 6c 2d   if( (pToplevel-
1f330 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61  >cookieMask & ma
1f340 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1f350 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
1f360 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  eMask |= mask;. 
1f370 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1f380 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
1f390 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1f3a0 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
1f3b0 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66  cookie;.      if
1f3c0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1f3d0 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
1f3e0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
1f3f0 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70  empDatabase(pTop
1f400 6c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  level);.      }.
1f410 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1f420 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
1f430 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  Db is NULL, then
1f440 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64   call sqlite3Cod
1f450 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20  eVerifySchema() 
1f460 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74  for each .** att
1f470 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
1f480 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b  Otherwise, invok
1f490 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74  e it for the dat
1f4a0 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20  abase named zDb 
1f4b0 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
1f4c0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
1f4d0 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65  amedSchema(Parse
1f4e0 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
1f4f0 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71  char *zDb){.  sq
1f500 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1f510 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
1f520 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1f530 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1f540 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
1f550 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
1f560 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44  pDb->pBt && (!zD
1f570 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53  b || 0==sqlite3S
1f580 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d  trICmp(zDb, pDb-
1f590 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20  >zName)) ){.    
1f5a0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1f5b0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
1f5c0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
1f5d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1f5e0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
1f5f0 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
1f600 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1f610 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1f620 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
1f630 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
1f640 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
1f650 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
1f660 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
1f670 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
1f680 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
1f690 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
1f6a0 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
1f6b0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
1f6c0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
1f6d0 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
1f6e0 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
1f6f0 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
1f700 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
1f710 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
1f720 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
1f730 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
1f740 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
1f750 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
1f760 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
1f770 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
1f780 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
1f790 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
1f7a0 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
1f7b0 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
1f7c0 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
1f7d0 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
1f7e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
1f7f0 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
1f800 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1f810 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
1f820 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
1f830 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
1f840 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
1f850 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
1f860 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
1f870 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
1f880 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
1f890 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
1f8a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1f8b0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
1f8c0 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
1f8d0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1f8e0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1f8f0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  el(pParse);.  sq
1f900 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1f910 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
1f920 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  b);.  pToplevel-
1f930 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 28 28  >writeMask |= ((
1f940 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b  yDbMask)1)<<iDb;
1f950 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
1f960 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65  MultiWrite |= se
1f970 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f  tStatement;.}../
1f980 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
1f990 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
1f9a0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1f9b0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69   construction mi
1f9c0 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72  ght write.** mor
1f9d0 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79  e than one entry
1f9e0 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74   (example: delet
1f9f0 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e  ing one row then
1fa00 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68   inserting anoth
1fa10 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67  er,.** inserting
1fa20 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69   multiple rows i
1fa30 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e  n a table, or in
1fa40 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e  serting a row an
1fa50 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e  d index entries.
1fa60 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74  ).** If an abort
1fa70 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f   occurs after so
1fa80 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74  me of these writ
1fa90 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65  es have complete
1faa0 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a  d, then it will.
1fab0 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
1fac0 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70  to undo the comp
1fad0 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f  leted writes..*/
1fae0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c  .void sqlite3Mul
1faf0 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70  tiWrite(Parse *p
1fb00 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
1fb10 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1fb20 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1fb30 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
1fb40 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
1fb50 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  rite = 1;.}../* 
1fb60 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
1fb70 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69  erator calls thi
1fb80 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20  s routine if is 
1fb90 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69  discovers that i
1fba0 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  t is.** possible
1fbb0 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74   to abort a stat
1fbc0 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63  ement prior to c
1fbd0 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f  ompletion.  In o
1fbe0 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66  rder to .** perf
1fbf0 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77  orm this abort w
1fc00 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e  ithout corruptin
1fc10 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
1fc20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a  we need to make.
1fc30 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ** sure that the
1fc40 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72   statement is pr
1fc50 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61  otected by a sta
1fc60 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1fc70 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69  on..**.** Techni
1fc80 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e  cally, we only n
1fc90 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d  eed to set the m
1fca0 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20  ayAbort flag if 
1fcb0 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72  the.** isMultiWr
1fcc0 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65  ite flag was pre
1fcd0 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68  viously set.  Th
1fce0 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65  ere is a time de
1fcf0 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68  pendency.** such
1fd00 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20   that the abort 
1fd10 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72  must occur after
1fd20 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e   the multiwrite.
1fd30 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20    This makes.** 
1fd40 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20  some statements 
1fd50 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45  involving the RE
1fd60 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72  PLACE conflict r
1fd70 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
1fd80 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74  thm.** go a litt
1fd90 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20  le faster.  But 
1fda0 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65  taking advantage
1fdb0 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65   of this time de
1fdc0 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65  pendency.** make
1fdd0 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
1fde0 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61  ult to prove tha
1fdf0 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f  t the code is co
1fe00 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61  rrect (in .** pa
1fe10 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65  rticular, it pre
1fe20 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72  vents us from wr
1fe30 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69  iting an effecti
1fe40 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ve.** implementa
1fe50 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41  tion of sqlite3A
1fe60 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29  ssertMayAbort())
1fe70 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
1fe80 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b  chosen.** to tak
1fe90 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65  e the safe route
1fea0 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70   and skip the op
1feb0 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  timization..*/.v
1fec0 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62  oid sqlite3MayAb
1fed0 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ort(Parse *pPars
1fee0 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
1fef0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1ff00 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1ff10 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
1ff20 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31  el->mayAbort = 1
1ff30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
1ff40 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20  an OP_Halt that 
1ff50 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20  causes the vdbe 
1ff60 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  to return an SQL
1ff70 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a  ITE_CONSTRAINT.*
1ff80 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45  * error. The onE
1ff90 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64  rror parameter d
1ffa0 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
1ffb0 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20  (if any) of the 
1ffc0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64  statement.** and
1ffd0 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e  /or current tran
1ffe0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1fff0 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  d back..*/.void 
20000 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
20010 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
20020 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
20030 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20040 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20  .  int errCode, 
20050 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64       /* extended
20060 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
20070 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
20080 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74     /* Constraint
20090 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
200a0 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *p4,         /* 
200b0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
200c0 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20 20 20  .  i8 p4type,   
200d0 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49       /* P4_STATI
200e0 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e  C or P4_TRANSIEN
200f0 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d  T */.  u8 p5Errm
20100 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45  sg       /* P5_E
20110 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b  rrMsg type */.){
20120 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
20130 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
20140 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  se);.  assert( (
20150 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53  errCode&0xff)==S
20160 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
20170 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f   );.  if( onErro
20180 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  r==OE_Abort ){. 
20190 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
201a0 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
201b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
201c0 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
201d0 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72  errCode, onError
201e0 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29  , 0, p4, p4type)
201f0 3b 0a 20 20 69 66 28 20 70 35 45 72 72 6d 73 67  ;.  if( p5Errmsg
20200 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
20210 61 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d  angeP5(v, p5Errm
20220 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  sg);.}../*.** Co
20230 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75  de an OP_Halt du
20240 65 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50  e to UNIQUE or P
20250 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
20260 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e  raint violation.
20270 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20280 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74  UniqueConstraint
20290 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
202a0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
202b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
202c0 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
202d0 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79  /* Constraint ty
202e0 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  pe */.  Index *p
202f0 49 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Idx       /* The
20300 20 69 6e 64 65 78 20 74 68 61 74 20 74 72 69 67   index that trig
20310 67 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61  gers the constra
20320 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  int */.){.  char
20330 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b   *zErr;.  int j;
20340 0a 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d  .  StrAccum errM
20350 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  sg;.  Table *pTa
20360 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
20370 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  ;..  sqlite3StrA
20380 63 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67  ccumInit(&errMsg
20390 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20  , 0, 0, 200);.  
203a0 65 72 72 4d 73 67 2e 64 62 20 3d 20 70 50 61 72  errMsg.db = pPar
203b0 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 6a 3d  se->db;.  for(j=
203c0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; j<pIdx->nKeyC
203d0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 63 68  ol; j++){.    ch
203e0 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 54 61 62 2d  ar *zCol = pTab-
203f0 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
20400 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
20410 20 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69      if( j ) sqli
20420 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
20430 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c  d(&errMsg, ", ",
20440 20 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   2);.    sqlite3
20450 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
20460 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e  errMsg, pTab->zN
20470 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  ame, -1);.    sq
20480 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
20490 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22  end(&errMsg, "."
204a0 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
204b0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
204c0 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 2c 20 2d  &errMsg, zCol, -
204d0 31 29 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d  1);.  }.  zErr =
204e0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
204f0 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b  Finish(&errMsg);
20500 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
20510 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
20520 20 0a 20 20 20 20 28 70 49 64 78 2d 3e 61 75 74   .    (pIdx->aut
20530 6f 49 6e 64 65 78 3d 3d 32 29 3f 53 51 4c 49 54  oIndex==2)?SQLIT
20540 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
20550 4d 41 52 59 4b 45 59 3a 53 51 4c 49 54 45 5f 43  MARYKEY:SQLITE_C
20560 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
20570 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a  ,.    onError, z
20580 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Err, P4_DYNAMIC,
20590 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
205a0 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ique);.}.../*.**
205b0 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
205c0 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71   due to non-uniq
205d0 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69  ue rowid..*/.voi
205e0 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f  d sqlite3RowidCo
205f0 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
20600 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
20610 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
20620 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
20630 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c  r,      /* Confl
20640 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
20650 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61  lgorithm */.  Ta
20660 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20 20  ble *pTab       
20670 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69 74  /* The table wit
20680 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65  h the non-unique
20690 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20   rowid */ .){.  
206a0 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e  char *zMsg;.  in
206b0 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62  t rc;.  if( pTab
206c0 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
206d0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
206e0 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
206f0 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
20700 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20720 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
20730 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
20740 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
20750 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
20760 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c  RIMARYKEY;.  }el
20770 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  se{.    zMsg = s
20780 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
20790 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f  arse->db, "%s.ro
207a0 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  wid", pTab->zNam
207b0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
207c0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
207d0 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OWID;.  }.  sqli
207e0 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
207f0 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e  t(pParse, rc, on
20800 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f  Error, zMsg, P4_
20810 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20  DYNAMIC,.       
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
20840 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ique);.}../*.** 
20850 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
20860 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20  pIndex uses the 
20870 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
20880 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72  ce pColl.  Retur
20890 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20  n.** true if it 
208a0 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69  does and false i
208b0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
208c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
208d0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
208e0 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69  atic int collati
208f0 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
20900 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78  ar *zColl, Index
20910 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
20920 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   i;.  assert( zC
20930 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  oll!=0 );.  for(
20940 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
20950 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
20960 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
20970 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
20980 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
20990 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d   z!=0 || pIndex-
209a0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29  >aiColumn[i]<0 )
209b0 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
209c0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30  ->aiColumn[i]>=0
209d0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
209e0 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20  rICmp(z, zColl) 
209f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20a00 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
20a10 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
20a20 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
20a30 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
20a40 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
20a50 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
20a60 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
20a70 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
20a80 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
20a90 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
20aa0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
20ab0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
20ac0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
20ad0 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
20ae0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
20af0 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
20b00 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
20b10 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
20b20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
20b30 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
20b40 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
20b50 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
20b60 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
20b70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
20b80 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
20b90 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
20ba0 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
20bb0 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
20bc0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
20bd0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
20be0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
20bf0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
20c00 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
20c10 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
20c20 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
20c30 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
20c40 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
20c50 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
20c60 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
20c70 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
20c80 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
20c90 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
20ca0 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
20cb0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
20cc0 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
20cd0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
20ce0 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
20cf0 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
20d00 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
20d10 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
20d20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20d30 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
20d40 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
20d50 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
20d60 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
20d70 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
20d80 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
20d90 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
20da0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
20db0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20dd0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
20de0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
20df0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
20e00 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
20e10 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
20e20 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
20e30 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
20e40 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
20e50 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
20e60 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
20e70 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
20e80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
20e90 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
20ea0 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
20eb0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
20ec0 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
20ed0 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20  ) );  /* Needed 
20ee0 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
20ef0 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30  s */.  for(iDb=0
20f00 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
20f10 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
20f20 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61  +, pDb++){.    a
20f30 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b  ssert( pDb!=0 );
20f40 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
20f50 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
20f60 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
20f70 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
20f80 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
20f90 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
20fa0 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
20fb0 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e  a(k);.      rein
20fc0 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
20fd0 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   pTab, zColl);. 
20fe0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
20ff0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
21000 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52  e code for the R
21010 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
21020 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49  **.**        REI
21030 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20  NDEX            
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21050 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 1.**        R
21060 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69  EINDEX  <collati
21070 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  on>             
21080 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
21090 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
210a0 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
210b0 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20  e>  -- 3.**     
210c0 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
210d0 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e  tabase>.?<indexn
210e0 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a  ame>  -- 4.**.**
210f0 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61   Form 1 causes a
21100 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
21110 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
21120 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69  ases to be rebui
21130 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65  lt..** Form 2 re
21140 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63  builds all indic
21150 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
21160 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
21170 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74   named.** collat
21180 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46  ing function.  F
21190 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62  orms 3 and 4 reb
211a0 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69  uild the named i
211b0 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69  ndex or all.** i
211c0 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
211d0 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
211e0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
211f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
21200 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69  EINDEX.void sqli
21210 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65  te3Reindex(Parse
21220 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
21230 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
21240 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53  pName2){.  CollS
21250 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
21260 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
21270 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
21280 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72  be reindexed, or
21290 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
212a0 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
212b0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
212c0 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
212d0 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
212e0 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
212f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
21300 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
21310 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21330 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
21340 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
21350 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
21360 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
21370 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
21380 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69  with pTab */.  i
21390 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
213a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
213b0 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
213c0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
213d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
213e0 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
213f0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
21400 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
21410 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20  pObjName;       
21420 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
21430 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
21440 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ex to be reindex
21450 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
21460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
21470 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
21480 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
21490 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
214a0 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
214b0 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
214c0 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
214d0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
214e0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
214f0 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
21500 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
21510 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
21520 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
21530 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ses(pParse, 0);.
21540 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
21550 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e  lse if( NEVER(pN
21560 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d  ame2==0) || pNam
21570 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
21580 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
21590 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d   assert( pName1-
215a0 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20  >z );.    zColl 
215b0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
215c0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
215d0 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
215e0 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
215f0 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  urn;.    pColl =
21600 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
21610 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
21620 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   zColl, 0);.    
21630 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
21640 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
21650 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
21660 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
21670 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
21680 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
21690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
216a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
216b0 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20  oll);.  }.  iDb 
216c0 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
216d0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
216e0 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
216f0 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
21700 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
21710 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
21720 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f  FromToken(db, pO
21730 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  bjName);.  if( z
21740 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
21750 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
21760 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62  b].zName;.  pTab
21770 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
21780 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
21790 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
217a0 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
217b0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
217c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
217d0 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
217e0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
217f0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
21800 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
21810 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Db);.  sqlite3Db
21820 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69  Free(db, z);.  i
21830 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
21840 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
21850 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
21860 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
21870 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
21880 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
21890 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
218a0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
218b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
218c0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
218d0 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
218e0 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
218f0 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
21900 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65  *.** Return a Ke
21910 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
21920 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
21930 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
21940 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54  n Index..**.** T
21950 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
21960 74 75 72 65 20 66 6f 72 20 61 6e 20 69 6e 64 65  ture for an inde
21970 78 20 69 73 20 63 61 63 68 65 64 20 69 6e 20 74  x is cached in t
21980 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e  he Index object.
21990 0a 2a 2a 20 53 6f 20 74 68 65 72 65 20 6d 69 67  .** So there mig
219a0 68 74 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 72  ht be multiple r
219b0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
219c0 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
219d0 72 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 65  r.  The.** calle
219e0 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 74 72 79  r should not try
219f0 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 4b   to modify the K
21a00 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  eyInfo object..*
21a10 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
21a20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
21a30 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
21a40 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72  f() on the retur
21a50 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68  ned object.** wh
21a60 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 68  en it has finish
21a70 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a  ed using it..*/.
21a80 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
21a90 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50  KeyInfoOfIndex(P
21aa0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
21ab0 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66  dex *pIdx){.  if
21ac0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
21ad0 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 6e 64   return 0;.#ifnd
21ae0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
21af0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66  HARED_CACHE.  if
21b00 28 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f  ( pIdx->pKeyInfo
21b10 20 26 26 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e   && pIdx->pKeyIn
21b20 66 6f 2d 3e 64 62 21 3d 70 50 61 72 73 65 2d 3e  fo->db!=pParse->
21b30 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  db ){.    sqlite
21b40 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 49  3KeyInfoUnref(pI
21b50 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  dx->pKeyInfo);. 
21b60 20 20 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66     pIdx->pKeyInf
21b70 6f 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  o = 0;.  }.#endi
21b80 66 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4b  f.  if( pIdx->pK
21b90 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  eyInfo==0 ){.   
21ba0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
21bb0 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f  nCol = pIdx->nCo
21bc0 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 4b  lumn;.    int nK
21bd0 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  ey = pIdx->nKeyC
21be0 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20  ol;.    KeyInfo 
21bf0 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 70  *pKey;.    if( p
21c00 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  Idx->uniqNotNull
21c10 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d   ){.      pKey =
21c20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
21c30 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
21c40 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79   nKey, nCol-nKey
21c50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21c60 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
21c70 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
21c80 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c  Parse->db, nCol,
21c90 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
21ca0 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
21cb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21cc0 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
21cd0 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20  le(pKey) );.    
21ce0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
21cf0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
21d00 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
21d10 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
21d20 20 20 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c          if( zCol
21d30 6c 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22  l==0 ) zColl = "
21d40 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
21d50 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pKey->aColl[i] 
21d60 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
21d70 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
21d80 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 70  Coll);.        p
21d90 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Key->aSortOrder[
21da0 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  i] = pIdx->aSort
21db0 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20  Order[i];.      
21dc0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  }.      if( pPar
21dd0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
21de0 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
21df0 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20  foUnref(pKey);. 
21e00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21e10 20 20 20 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e      pIdx->pKeyIn
21e20 66 6f 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20  fo = pKey;.     
21e30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
21e40 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4b 65 79  eturn sqlite3Key
21e50 49 6e 66 6f 52 65 66 28 70 49 64 78 2d 3e 70 4b  InfoRef(pIdx->pK
21e60 65 79 49 6e 66 6f 29 3b 0a 7d 0a                 eyInfo);.}.