15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2001 September 15
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains C code routines that are called by the SQLite parser
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** when syntax rules are reduced.  The routines in this file handle the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** following kinds of SQL syntax:
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     CREATE TABLE
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     DROP TABLE
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     CREATE INDEX
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     DROP INDEX
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     creating ID lists
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     BEGIN TRANSACTION
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     COMMIT
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     ROLLBACK
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called when a new SQL statement is beginning to
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be parsed.  Initialize the pParse structure as needed.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3BeginParse(Parse *pParse, int explainFlag){
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->explain = (u8)explainFlag;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->nVar = 0;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SHARED_CACHE
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The TableLock structure is only used by the sqlite3TableLock() and
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** codeTableLocks() functions.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TableLock {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;             /* The database containing the table to be locked */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iTab;            /* The root page of the table to be locked */
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 isWriteLock;      /* True for write lock.  False for a read lock */
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zName;   /* Name of the table */
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Record the fact that we want to lock a table at run-time.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The table to be locked has root page iTab and is found in database iDb.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A read or a write lock can be taken depending on isWritelock.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine just records the fact that the lock is desired.  The
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** code to make the lock occur is generated by a later call to
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** codeTableLocks() which occurs during sqlite3FinishCoding().
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3TableLock(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,     /* Parsing context */
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb,           /* Index of the database containing the table to lock */
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iTab,          /* Root page number of the table to be locked */
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 isWriteLock,    /* True for a write lock */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zName  /* Name of the table to be locked */
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pToplevel = sqlite3ParseToplevel(pParse);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nBytes;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TableLock *p;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iDb>=0 );
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<pToplevel->nTableLock; i++){
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p = &pToplevel->aTableLock[i];
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->iDb==iDb && p->iTab==iTab ){
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->isWriteLock = (p->isWriteLock || isWriteLock);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nBytes = sizeof(TableLock) * (pToplevel->nTableLock+1);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pToplevel->aTableLock =
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbReallocOrFree(pToplevel->db, pToplevel->aTableLock, nBytes);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pToplevel->aTableLock ){
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p = &pToplevel->aTableLock[pToplevel->nTableLock++];
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->iDb = iDb;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->iTab = iTab;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->isWriteLock = isWriteLock;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->zName = zName;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pToplevel->nTableLock = 0;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pToplevel->db->mallocFailed = 1;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Code an OP_TableLock instruction for each table locked by the
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** statement (configured by calls to sqlite3TableLock()).
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void codeTableLocks(Parse *pParse){
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *pVdbe;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVdbe = sqlite3GetVdbe(pParse);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pVdbe!=0 ); /* sqlite3GetVdbe cannot fail: VDBE already allocated */
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<pParse->nTableLock; i++){
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TableLock *p = &pParse->aTableLock[i];
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int p1 = p->iDb;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp4(pVdbe, OP_TableLock, p1, p->iTab, p->isWriteLock,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      p->zName, P4_STATIC);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define codeTableLocks(x)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called after a single SQL statement has been
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parsed and a VDBE program to execute that statement has been
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** prepared.  This routine puts the finishing touches on the
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** VDBE program and resets the pParse structure for the next
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parse.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Note that if an error occurred, it might be the case that
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** no VDBE code was generated.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3FinishCoding(Parse *pParse){
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db = pParse->db;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed ) return;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pParse->nested ) return;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pParse->nErr ) return;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Begin by generating some termination code at the end of the
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** vdbe program
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v = sqlite3GetVdbe(pParse);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !pParse->isMultiWrite
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( v ){
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp0(v, OP_Halt);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The cookie mask contains one bit for each database file open.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** (Bit 0 is for main, bit 1 is for temp, and so forth.)  Bits are
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** set for each database that is used.  Generate code to start a
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** transaction on each used database and to verify the schema cookie
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** on each used database.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pParse->cookieGoto>0 ){
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      yDbMask mask;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int iDb;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeJumpHere(v, pParse->cookieGoto-1);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(iDb=0, mask=1; iDb<db->nDb; mask<<=1, iDb++){
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( (mask & pParse->cookieMask)==0 ) continue;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeUsesBtree(v, iDb);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeAddOp2(v,OP_Transaction, iDb, (mask & pParse->writeMask)!=0);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( db->init.busy==0 ){
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3VdbeAddOp3(v, OP_VerifyCookie,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            iDb, pParse->cookieValue[iDb],
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            db->aDb[iDb].pSchema->iGeneration);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int i;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(i=0; i<pParse->nVtabLock; i++){
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pParse->nVtabLock = 0;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Once all the cookies have been verified and transactions opened,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** obtain the required table-locks. This is a no-op unless the
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** shared-cache feature is enabled.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      codeTableLocks(pParse);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Initialize any AUTOINCREMENT data structures required.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3AutoincrementBegin(pParse);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Finally, jump back to the beginning of the executable code. */
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Goto, 0, pParse->cookieGoto);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Get the VDBE program ready for execution
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( v && ALWAYS(pParse->nErr==0) && !db->mallocFailed ){
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE *trace = (db->flags & SQLITE_VdbeTrace)!=0 ? stdout : 0;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeTrace(v, trace);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pParse->iCacheLevel==0 );  /* Disables and re-enables match */
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* A minimum of one cursor is required if autoincrement is used
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *  See ticket [a696379c1f08866] */
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pParse->pAinc!=0 && pParse->nTab==0 ) pParse->nTab = 1;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMakeReady(v, pParse->nVar, pParse->nMem,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         pParse->nTab, pParse->nMaxArg, pParse->explain,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         pParse->isMultiWrite && pParse->mayAbort);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->rc = SQLITE_DONE;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->colNamesSet = 0;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->rc = SQLITE_ERROR;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->nTab = 0;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->nMem = 0;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->nSet = 0;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->nVar = 0;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->cookieMask = 0;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->cookieGoto = 0;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Run the parser and code generator recursively in order to generate
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** code for the SQL statement given onto the end of the pParse context
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** currently under construction.  When the parser is run recursively
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this way, the final OP_Halt is not appended and other initialization
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and finalization steps are omitted because those are handling by the
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** outermost parser.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Not everything is nestable.  This facility is designed to permit
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** INSERT, UPDATE, and DELETE operations against SQLITE_MASTER.  Use
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** care if you decide to try to use this routine for some other purposes.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list ap;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zSql;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zErrMsg = 0;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SAVE_SZ  (sizeof(Parse) - offsetof(Parse,nVar))
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char saveBuf[SAVE_SZ];
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pParse->nErr ) return;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pParse->nested<10 );  /* Nesting should only be of limited depth */
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_start(ap, zFormat);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zSql = sqlite3VMPrintf(db, zFormat, ap);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_end(ap);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zSql==0 ){
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;   /* A malloc must have failed */
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->nested++;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(saveBuf, &pParse->nVar, SAVE_SZ);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&pParse->nVar, 0, SAVE_SZ);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3RunParser(pParse, zSql, &zErrMsg);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, zErrMsg);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, zSql);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(&pParse->nVar, saveBuf, SAVE_SZ);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->nested--;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Locate the in-memory structure that describes a particular database
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table given the name of that table and (optionally) the name of the
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database containing the table.  Return NULL if not found.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If zDatabase is 0, all databases are searched for the table and the
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** first matching table is returned.  (No checking for duplicate table
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** names is done.)  The search order is TEMP first, then MAIN, then any
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** auxiliary databases added using the ATTACH command.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also sqlite3LocateTable().
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *p = 0;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nName;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zName!=0 );
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nName = sqlite3Strlen30(zName);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* All mutexes are required for schema access.  Make sure we hold them. */
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zDatabase!=0 || sqlite3BtreeHoldsAllMutexes(db) );
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=OMIT_TEMPDB; i<db->nDb; i++){
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int j = (i<2) ? i^1 : i;   /* Search TEMP before MAIN */
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( sqlite3SchemaMutexHeld(db, j, 0) );
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName, nName);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p ) break;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Locate the in-memory structure that describes a particular database
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table given the name of that table and (optionally) the name of the
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database containing the table.  Return NULL if not found.  Also leave an
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** error message in pParse->zErrMsg.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The difference between this routine and sqlite3FindTable() is that this
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routine leaves an error message in pParse->zErrMsg where
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3FindTable() does not.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Table *sqlite3LocateTable(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,         /* context in which to report errors */
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int isView,            /* True if looking for a VIEW rather than a TABLE */
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zName,     /* Name of the table we are looking for */
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zDbase     /* Name of the database.  Might be NULL */
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *p;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Read the database schema. If an error occurs, leave an error message
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** and code in pParse and return NULL. */
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = sqlite3FindTable(pParse->db, zName, zDbase);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 ){
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zMsg = isView ? "no such view" : "no such table";
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zDbase ){
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->checkSchema = 1;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Locate the in-memory structure that describes
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a particular index given the name of that index
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and the name of the database that contains the index.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return NULL if not found.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If zDatabase is 0, all databases are searched for the
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table and the first matching index is returned.  (No checking
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for duplicate index names is done.)  The search order is
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** TEMP first, then MAIN, then any auxiliary databases added
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** using the ATTACH command.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Index *p = 0;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nName = sqlite3Strlen30(zName);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* All mutexes are required for schema access.  Make sure we hold them. */
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) );
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=OMIT_TEMPDB; i<db->nDb; i++){
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int j = (i<2) ? i^1 : i;  /* Search TEMP before MAIN */
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Schema *pSchema = db->aDb[j].pSchema;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pSchema );
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zName) ) continue;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( sqlite3SchemaMutexHeld(db, j, 0) );
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p = sqlite3HashFind(&pSchema->idxHash, zName, nName);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p ) break;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Reclaim the memory used by an index
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void freeIndex(sqlite3 *db, Index *p){
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_ANALYZE
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DeleteIndexSamples(db, p);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, p->zColAff);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, p);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For the index called zIdxName which is found in the database iDb,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** unlike that index from its Table then remove the index from
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the index hash table and free all memory structures associated
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with the index.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Index *pIndex;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int len;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Hash *pHash;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pHash = &db->aDb[iDb].pSchema->idxHash;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  len = sqlite3Strlen30(zIdxName);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex = sqlite3HashInsert(pHash, zIdxName, len, 0);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pIndex) ){
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pIndex->pTable->pIndex==pIndex ){
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pIndex->pTable->pIndex = pIndex->pNext;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Index *p;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Justification of ALWAYS();  The index must be on the list of
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** indices. */
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p = pIndex->pTable->pIndex;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while( ALWAYS(p) && p->pNext!=pIndex ){ p = p->pNext; }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( ALWAYS(p && p->pNext==pIndex) ){
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->pNext = pIndex->pNext;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    freeIndex(db, pIndex);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db->flags |= SQLITE_InternChanges;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Erase all schema information from the in-memory hash tables of
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a single database.  This routine is called to reclaim memory
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** before the database closes.  It is also called during a rollback
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if there were schema changes during the transaction or if a
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** schema-cookie mismatch occurs.
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If iDb<0 then reset the internal schema tables for all database
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** files.  If iDb>=0 then reset the internal schema for only the
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** single file indicated.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i, j;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iDb<db->nDb );
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iDb>=0 ){
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Case 1:  Reset the single schema identified by iDb */
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Db *pDb = &db->aDb[iDb];
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pDb->pSchema!=0 );
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SchemaClear(pDb->pSchema);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If any database other than TEMP is reset, then also reset TEMP
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** since TEMP might be holding triggers that reference tables in the
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** other database.
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( iDb!=1 ){
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pDb = &db->aDb[1];
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pDb->pSchema!=0 );
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3SchemaClear(pDb->pSchema);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Case 2 (from here to the end): Reset all schemas for all attached
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** databases. */
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iDb<0 );
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3BtreeEnterAll(db);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<db->nDb; i++){
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Db *pDb = &db->aDb[i];
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pDb->pSchema ){
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3SchemaClear(pDb->pSchema);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db->flags &= ~SQLITE_InternChanges;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VtabUnlockList(db);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3BtreeLeaveAll(db);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If one or more of the auxiliary database files has been closed,
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** then remove them from the auxiliary database list.  We take the
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** opportunity to do this here since we have just deleted all of the
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** schema hash tables and therefore do not have to make any changes
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** to any of those tables.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=j=2; i<db->nDb; i++){
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct Db *pDb = &db->aDb[i];
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pDb->pBt==0 ){
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, pDb->zName);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pDb->zName = 0;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( j<i ){
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->aDb[j] = db->aDb[i];
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    j++;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&db->aDb[j], 0, (db->nDb-j)*sizeof(db->aDb[j]));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db->nDb = j;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->nDb<=2 && db->aDb!=db->aDbStatic ){
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0]));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, db->aDb);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->aDb = db->aDbStatic;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called when a commit occurs.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3CommitInternalChanges(sqlite3 *db){
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db->flags &= ~SQLITE_InternChanges;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete memory allocated for the column names of a table or view (the
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Table.aCol[] array).
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sqliteDeleteColumnNames(sqlite3 *db, Table *pTable){
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Column *pCol;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pTable!=0 );
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pCol = pTable->aCol)!=0 ){
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<pTable->nCol; i++, pCol++){
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, pCol->zName);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprDelete(db, pCol->pDflt);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, pCol->zDflt);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, pCol->zType);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, pCol->zColl);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pTable->aCol);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Remove the memory data structures associated with the given
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Table.  No changes are made to disk by this routine.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine just deletes the data structure.  It does not unlink
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the table data structure from the hash table.  But it does destroy
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** memory structures of the indices and foreign keys associated with
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the table.
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Index *pIndex, *pNext;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !pTable || pTable->nRef>0 );
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Do not delete the table until the reference count reaches zero. */
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !pTable ) return;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ((!db || db->pnBytesFreed==0) && (--pTable->nRef)>0) ) return;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Delete all indices associated with this table. */
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNext = pIndex->pNext;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pIndex->pSchema==pTable->pSchema );
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !db || db->pnBytesFreed==0 ){
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char *zName = pIndex->zName;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TESTONLY ( Index *pOld = ) sqlite3HashInsert(
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  &pIndex->pSchema->idxHash, zName, sqlite3Strlen30(zName), 0
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) );
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOld==pIndex || pOld==0 );
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    freeIndex(db, pIndex);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Delete any foreign keys attached to this table. */
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3FkDelete(db, pTable);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Delete the Table structure itself.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqliteDeleteColumnNames(db, pTable);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, pTable->zName);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, pTable->zColAff);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3SelectDelete(db, pTable->pSelect);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CHECK
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprDelete(db, pTable->pCheck);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VtabClear(db, pTable);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, pTable);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Unlink the given table from the hash tables and the delete the
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table structure with all its indices and foreign keys.
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *p;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Db *pDb;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db!=0 );
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iDb>=0 && iDb<db->nDb );
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zTabName );
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( zTabName[0]==0 );  /* Zero-length table names are allowed */
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pDb = &db->aDb[iDb];
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        sqlite3Strlen30(zTabName),0);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DeleteTable(db, p);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db->flags |= SQLITE_InternChanges;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Given a token, return a string that consists of the text of that
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** token.  Space to hold the returned string
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is obtained from sqliteMalloc() and must be freed by the calling
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** function.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Any quotation marks (ex:  "name", 'name', [name], or `name`) that
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** surround the body of the token are removed.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Tokens are often just pointers into the original SQL text and so
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are not \000 terminated and are not persistent.  The returned string
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is \000 terminated and is persistent.
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *sqlite3NameFromToken(sqlite3 *db, Token *pName){
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zName;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pName ){
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zName = sqlite3DbStrNDup(db, (char*)pName->z, pName->n);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3Dequote(zName);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zName = 0;
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return zName;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Open the sqlite_master table stored in database number iDb for
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** writing. The table is opened using cursor 0.
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3OpenMasterTable(Parse *p, int iDb){
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = sqlite3GetVdbe(p);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3TableLock(p, iDb, MASTER_ROOT, 1, SCHEMA_TABLE(iDb));
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp3(v, OP_OpenWrite, 0, MASTER_ROOT, iDb);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeChangeP4(v, -1, (char *)5, P4_INT32);  /* 5 column table */
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->nTab==0 ){
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->nTab = 1;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Parameter zName points to a nul-terminated buffer containing the name
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of a database ("main", "temp" or the name of an attached db). This
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** function returns the index of the named database in db->aDb[], or
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** -1 if the named db cannot be found.
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3FindDbName(sqlite3 *db, const char *zName){
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i = -1;         /* Database number */
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zName ){
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Db *pDb;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int n = sqlite3Strlen30(zName);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( (!OMIT_TEMPDB || i!=1 ) && n==sqlite3Strlen30(pDb->zName) &&
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          0==sqlite3StrICmp(pDb->zName, zName) ){
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The token *pName contains the name of a database (either "main" or
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "temp" or the name of an attached db). This routine returns the
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** index of the named database in db->aDb[], or -1 if the named db
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** does not exist.
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3FindDb(sqlite3 *db, Token *pName){
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;                               /* Database number */
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zName;                         /* Name we are searching for */
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zName = sqlite3NameFromToken(db, pName);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i = sqlite3FindDbName(db, zName);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, zName);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The table or view or trigger name is passed to this routine via tokens
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pName1 and pName2. If the table name was fully qualified, for example:
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** CREATE TABLE xxx.yyy (...);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the table name is not fully qualified, i.e.:
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** CREATE TABLE yyy(...);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Then pName1 is set to "yyy" and pName2 is "".
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine sets the *ppUnqual pointer to point at the token (pName1 or
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pName2) that stores the unqualified table name.  The index of the
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database "xxx" is returned.
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3TwoPartName(
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,      /* Parsing and code generating context */
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName1,      /* The "xxx" in the name "xxx.yyy" or "xxx" */
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName2,      /* The "yyy" in the name "xxx.yyy" */
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token **pUnqual     /* Write the unqualified object name here */
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;                    /* Database holding the object */
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pName2!=0) && pName2->n>0 ){
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( db->init.busy ) {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "corrupt database");
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pParse->nErr++;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return -1;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *pUnqual = pName2;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iDb = sqlite3FindDb(db, pName1);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( iDb<0 ){
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "unknown database %T", pName1);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pParse->nErr++;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return -1;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( db->init.iDb==0 || db->init.busy );
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iDb = db->init.iDb;
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *pUnqual = pName1;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return iDb;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is used to check if the UTF-8 string zName is a legal
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** unqualified name for a new schema object (table, index, view or
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** trigger). All names are legal except those that begin with the string
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "sqlite_" (in upper, lower or mixed case). This portion of the namespace
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is reserved for internal use.
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3CheckObjectName(Parse *pParse, const char *zName){
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !pParse->db->init.busy && pParse->nested==0
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          && (pParse->db->flags & SQLITE_WriteSchema)==0
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName);
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_ERROR;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SQLITE_OK;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Begin constructing a new table representation in memory.  This is
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the first of several action routines that get called in response
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to a CREATE TABLE statement.  In particular, this routine is called
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** after seeing tokens "CREATE" and "TABLE" and the table name. The isTemp
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** flag is true if the table should be stored in the auxiliary database
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** file instead of in the main database file.  This is normally the case
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** when the "TEMP" or "TEMPORARY" keyword occurs in between
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** CREATE and TABLE.
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The new table record is initialized and put in pParse->pNewTable.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** As more of the CREATE TABLE statement is parsed, additional action
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routines will be called to add more information to this record.
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** At the end of the CREATE TABLE statement, the sqlite3EndTable() routine
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is called to complete the construction of the new table record.
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3StartTable(
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,   /* Parser context */
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName1,   /* First part of the name of the table or view */
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName2,   /* Second part of the name of the table or view */
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int isTemp,      /* True if this is a TEMP table */
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int isView,      /* True if this is a VIEW */
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int isVirtual,   /* True if this is a VIRTUAL table */
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int noErr        /* Do nothing if table already exists */
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTable;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zName = 0; /* The name of the new table */
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;         /* Database number to create the table in */
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName;    /* Unqualified name of the table to create */
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The table or view name to create is passed to this routine via tokens
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** pName1 and pName2. If the table name was fully qualified, for example:
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** CREATE TABLE xxx.yyy (...);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the table name is not fully qualified, i.e.:
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** CREATE TABLE yyy(...);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Then pName1 is set to "yyy" and pName2 is "".
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** The call below sets the pName pointer to point at the token (pName1 or
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** pName2) that stores the unqualified table name. The variable iDb is
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** set to the index of the database that the table or view is to be
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** created in.
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iDb<0 ) return;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !OMIT_TEMPDB && isTemp && pName2->n>0 && iDb!=1 ){
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If creating a temp table, the name may not be qualified. Unless
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the database name is "temp" anyway.  */
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "temporary table name must be unqualified");
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !OMIT_TEMPDB && isTemp ) iDb = 1;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->sNameToken = *pName;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zName = sqlite3NameFromToken(db, pName);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zName==0 ) return;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto begin_table_error;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->init.iDb==1 ) isTemp = 1;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTHORIZATION
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (isTemp & 1)==isTemp );
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int code;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zDb = db->aDb[iDb].zName;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto begin_table_error;
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( isView ){
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !OMIT_TEMPDB && isTemp ){
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        code = SQLITE_CREATE_TEMP_VIEW;
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        code = SQLITE_CREATE_VIEW;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !OMIT_TEMPDB && isTemp ){
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        code = SQLITE_CREATE_TEMP_TABLE;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        code = SQLITE_CREATE_TABLE;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !isVirtual && sqlite3AuthCheck(pParse, code, zName, 0, zDb) ){
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto begin_table_error;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Make sure the new table name does not collide with an existing
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** index or table name in the same database.  Issue an error message if
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** it does. The exception is if the statement being parsed was passed
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** to an sqlite3_declare_vtab() call. In that case only the column names
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** and types will be used, so there is no need to test for namespace
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** collisions.
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !IN_DECLARE_VTAB ){
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zDb = db->aDb[iDb].zName;
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto begin_table_error;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTable = sqlite3FindTable(db, zName, zDb);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pTable ){
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !noErr ){
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ErrorMsg(pParse, "table %T already exists", pName);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( !db->init.busy );
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3CodeVerifySchema(pParse, iDb);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto begin_table_error;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3FindIndex(db, zName, zDb)!=0 ){
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "there is already an index named %s", zName);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto begin_table_error;
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTable = sqlite3DbMallocZero(db, sizeof(Table));
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTable==0 ){
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->mallocFailed = 1;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->rc = SQLITE_NOMEM;
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->nErr++;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto begin_table_error;
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTable->zName = zName;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTable->iPKey = -1;
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTable->pSchema = db->aDb[iDb].pSchema;
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTable->nRef = 1;
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTable->nRowEst = 1000000;
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pParse->pNewTable==0 );
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pParse->pNewTable = pTable;
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If this is the magic sqlite_sequence table used by autoincrement,
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** then record a pointer to this table in the main database structure
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** so that INSERT can find the table easily.
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINCREMENT
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !pParse->nested && strcmp(zName, "sqlite_sequence")==0 ){
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTable->pSchema->pSeqTab = pTable;
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Begin generating the code that will insert the table record into
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the SQLITE_MASTER table.  Note in particular that we must go ahead
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** and allocate the record number for the table entry now.  Before any
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** PRIMARY KEY or UNIQUE keywords are parsed.  Those keywords will cause
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** indices to be created and the table record must come before the
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** indices.  Hence, the record number for the table must be allocated
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** now.
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int j1;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int fileFormat;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int reg1, reg2, reg3;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3BeginWriteOperation(pParse, 0, iDb);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( isVirtual ){
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp0(v, OP_VBegin);
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If the file format and encoding in the database have not been set,
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** set them now.
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reg1 = pParse->regRowid = ++pParse->nMem;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reg2 = pParse->regRoot = ++pParse->nMem;
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reg3 = ++pParse->nMem;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeUsesBtree(v, iDb);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    j1 = sqlite3VdbeAddOp1(v, OP_If, reg3);
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ?
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  1 : SQLITE_MAX_FILE_FORMAT;
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_Integer, fileFormat, reg3);
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, reg3);
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_Integer, ENC(db), reg3);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_TEXT_ENCODING, reg3);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeJumpHere(v, j1);
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* This just creates a place-holder record in the sqlite_master table.
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** The record created does not contain anything yet.  It will be replaced
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** by the real entry in code generated at sqlite3EndTable().
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** The rowid for the new entry is left in register pParse->regRowid.
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** The root page number of the new table is left in reg pParse->regRoot.
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** The rowid and root page number values are needed by the code that
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** sqlite3EndTable will generate.
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( isView || isVirtual ){
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Integer, 0, reg2);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_CreateTable, iDb, reg2);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3OpenMasterTable(pParse, iDb);
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_NewRowid, 0, reg1);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_Null, 0, reg3);
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp3(v, OP_Insert, 0, reg3, reg1);
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp0(v, OP_Close);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Normal (non-error) return. */
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If an error occurs, we jump here */
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)begin_table_error:
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, zName);
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This macro is used to compare two strings in a case-insensitive manner.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It is slightly faster than calling sqlite3StrICmp() directly, but
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** produces larger code.
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** WARNING: This macro is not compatible with the strcmp() family. It
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** returns true if the two strings are equal, otherwise false.
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define STRICMP(x, y) (\
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sqlite3UpperToLower[*(unsigned char *)(x)]==   \
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sqlite3UpperToLower[*(unsigned char *)(y)]     \
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)&& sqlite3StrICmp((x)+1,(y)+1)==0 )
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add a new column to the table currently being constructed.
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The parser calls this routine once for each column declaration
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in a CREATE TABLE statement.  sqlite3StartTable() gets called
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** first to get things going.  Then this routine is called for each
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** column.
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3AddColumn(Parse *pParse, Token *pName){
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *p;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Column *pCol;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (p = pParse->pNewTable)==0 ) return;
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_MAX_COLUMN
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->nCol+1>db->aLimit[SQLITE_LIMIT_COLUMN] ){
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = sqlite3NameFromToken(db, pName);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( z==0 ) return;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<p->nCol; i++){
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( STRICMP(z, p->aCol[i].zName) ){
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "duplicate column name: %s", z);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, z);
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (p->nCol & 0x7)==0 ){
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Column *aNew;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aNew = sqlite3DbRealloc(db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0]));
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( aNew==0 ){
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, z);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->aCol = aNew;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCol = &p->aCol[p->nCol];
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(pCol, 0, sizeof(p->aCol[0]));
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCol->zName = z;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If there is no type specified, columns have the default affinity
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** 'NONE'. If there is a type specified, then sqlite3AddColumnType() will
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** be called next to set pCol->affinity correctly.
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCol->affinity = SQLITE_AFF_NONE;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->nCol++;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called by the parser while in the middle of
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parsing a CREATE TABLE statement.  A "NOT NULL" constraint has
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** been seen on a column.  This routine sets the notNull flag on
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the column currently under construction.
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3AddNotNull(Parse *pParse, int onError){
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *p;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = pParse->pNewTable;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 || NEVER(p->nCol<1) ) return;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->aCol[p->nCol-1].notNull = (u8)onError;
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Scan the column type name zType (length nType) and return the
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** associated affinity type.
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine does a case-independent search of zType for the
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** substrings in the following table. If one of the substrings is
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** found, the corresponding affinity is returned. If zType contains
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** more than one of the substrings, entries toward the top of
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the table take priority. For example, if zType is 'BLOBINT',
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_AFF_INTEGER is returned.
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Substring     | Affinity
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** --------------------------------
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'INT'         | SQLITE_AFF_INTEGER
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'CHAR'        | SQLITE_AFF_TEXT
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'CLOB'        | SQLITE_AFF_TEXT
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'TEXT'        | SQLITE_AFF_TEXT
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'BLOB'        | SQLITE_AFF_NONE
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'REAL'        | SQLITE_AFF_REAL
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'FLOA'        | SQLITE_AFF_REAL
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'DOUB'        | SQLITE_AFF_REAL
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If none of the substrings in the above table are found,
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_AFF_NUMERIC is returned.
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char sqlite3AffinityType(const char *zIn){
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 h = 0;
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char aff = SQLITE_AFF_NUMERIC;
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zIn ) while( zIn[0] ){
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    h = (h<<8) + sqlite3UpperToLower[(*zIn)&0xff];
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zIn++;
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){             /* CHAR */
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aff = SQLITE_AFF_TEXT;
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( h==(('c'<<24)+('l'<<16)+('o'<<8)+'b') ){       /* CLOB */
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aff = SQLITE_AFF_TEXT;
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( h==(('t'<<24)+('e'<<16)+('x'<<8)+'t') ){       /* TEXT */
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aff = SQLITE_AFF_TEXT;
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( h==(('b'<<24)+('l'<<16)+('o'<<8)+'b')          /* BLOB */
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && (aff==SQLITE_AFF_NUMERIC || aff==SQLITE_AFF_REAL) ){
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aff = SQLITE_AFF_NONE;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( h==(('r'<<24)+('e'<<16)+('a'<<8)+'l')          /* REAL */
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && aff==SQLITE_AFF_NUMERIC ){
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aff = SQLITE_AFF_REAL;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( h==(('f'<<24)+('l'<<16)+('o'<<8)+'a')          /* FLOA */
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && aff==SQLITE_AFF_NUMERIC ){
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aff = SQLITE_AFF_REAL;
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( h==(('d'<<24)+('o'<<16)+('u'<<8)+'b')          /* DOUB */
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && aff==SQLITE_AFF_NUMERIC ){
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aff = SQLITE_AFF_REAL;
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( (h&0x00FFFFFF)==(('i'<<16)+('n'<<8)+'t') ){    /* INT */
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aff = SQLITE_AFF_INTEGER;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return aff;
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called by the parser while in the middle of
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parsing a CREATE TABLE statement.  The pFirst token is the first
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** token in the sequence of tokens that describe the type of the
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** column currently under construction.   pLast is the last token
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the sequence.  Use this information to construct a string
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that contains the typename of the column and store that string
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in zType.
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3AddColumnType(Parse *pParse, Token *pType){
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *p;
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Column *pCol;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = pParse->pNewTable;
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 || NEVER(p->nCol<1) ) return;
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCol = &p->aCol[p->nCol-1];
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pCol->zType==0 );
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCol->zType = sqlite3NameFromToken(pParse->db, pType);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCol->affinity = sqlite3AffinityType(pCol->zType);
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The expression is the default value for the most recently added column
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the table currently under construction.
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Default value expressions must be constant.  Raise an exception if this
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is not the case.
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called by the parser while in the middle of
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parsing a CREATE TABLE statement.
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3AddDefaultValue(Parse *pParse, ExprSpan *pSpan){
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *p;
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Column *pCol;
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = pParse->pNewTable;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p!=0 ){
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pCol = &(p->aCol[p->nCol-1]);
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !sqlite3ExprIsConstantOrFunction(pSpan->pExpr) ){
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant",
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pCol->zName);
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* A copy of pExpr is used instead of the original, as pExpr contains
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** tokens that point to volatile memory. The 'span' of the expression
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** is required by pragma table_info.
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ExprDelete(db, pCol->pDflt);
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pCol->pDflt = sqlite3ExprDup(db, pSpan->pExpr, EXPRDUP_REDUCE);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, pCol->zDflt);
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pCol->zDflt = sqlite3DbStrNDup(db, (char*)pSpan->zStart,
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     (int)(pSpan->zEnd - pSpan->zStart));
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprDelete(db, pSpan->pExpr);
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Designate the PRIMARY KEY for the table.  pList is a list of names
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of columns that form the primary key.  If pList is NULL, then the
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** most recently added column of the table is the primary key.
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A table can have at most one primary key.  If the table already has
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a primary key (and this is the second primary key) then create an
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** error.
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the PRIMARY KEY is on a single column whose datatype is INTEGER,
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then we will try to use that column as the rowid.  Set the Table.iPKey
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** field of the table under construction to be the index of the
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** INTEGER PRIMARY KEY column.  Table.iPKey is set to -1 if there is
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** no INTEGER PRIMARY KEY.
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the key is not an INTEGER PRIMARY KEY, then create a unique
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** index for the key.  No index is created for INTEGER PRIMARY KEYs.
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3AddPrimaryKey(
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,    /* Parsing context */
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprList *pList,  /* List of field names to be indexed */
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int onError,      /* What to do with a uniqueness conflict */
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int autoInc,      /* True if the AUTOINCREMENT keyword is present */
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int sortOrder     /* SQLITE_SO_ASC or SQLITE_SO_DESC */
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTab = pParse->pNewTable;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zType = 0;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iCol = -1, i;
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTab==0 || IN_DECLARE_VTAB ) goto primary_key_exit;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTab->tabFlags & TF_HasPrimaryKey ){
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse,
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "table \"%s\" has more than one primary key", pTab->zName);
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto primary_key_exit;
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTab->tabFlags |= TF_HasPrimaryKey;
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList==0 ){
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iCol = pTab->nCol - 1;
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTab->aCol[iCol].isPrimKey = 1;
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<pList->nExpr; i++){
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(iCol=0; iCol<pTab->nCol; iCol++){
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( sqlite3StrICmp(pList->a[i].zName, pTab->aCol[iCol].zName)==0 ){
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( iCol<pTab->nCol ){
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pTab->aCol[iCol].isPrimKey = 1;
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pList->nExpr>1 ) iCol = -1;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iCol>=0 && iCol<pTab->nCol ){
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zType = pTab->aCol[iCol].zType;
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zType && sqlite3StrICmp(zType, "INTEGER")==0
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        && sortOrder==SQLITE_SO_ASC ){
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTab->iPKey = iCol;
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTab->keyConf = (u8)onError;
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( autoInc==0 || autoInc==1 );
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTab->tabFlags |= autoInc*TF_Autoincrement;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( autoInc ){
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINCREMENT
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an "
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "INTEGER PRIMARY KEY");
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Index *p;
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p = sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, 0, sortOrder, 0);
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p ){
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->autoIndex = 2;
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pList = 0;
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)primary_key_exit:
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprListDelete(pParse->db, pList);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return;
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add a new CHECK constraint to the table currently under construction.
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3AddCheckConstraint(
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,    /* Parsing context */
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pCheckExpr  /* The check expression */
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CHECK
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTab = pParse->pNewTable;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTab && !IN_DECLARE_VTAB ){
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTab->pCheck = sqlite3ExprAnd(db, pTab->pCheck, pCheckExpr);
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprDelete(db, pCheckExpr);
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the collation function of the most recently parsed table column
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the CollSeq given.
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3AddCollateType(Parse *pParse, Token *pToken){
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *p;
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zColl;              /* Dequoted name of collation sequence */
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db;
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (p = pParse->pNewTable)==0 ) return;
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i = p->nCol-1;
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db = pParse->db;
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zColl = sqlite3NameFromToken(db, pToken);
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !zColl ) return;
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3LocateCollSeq(pParse, zColl) ){
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Index *pIdx;
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->aCol[i].zColl = zColl;
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If the column is declared as "<name> PRIMARY KEY COLLATE <type>",
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** then an index may have been created on this column before the
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** collation type was added. Correct this if it is the case.
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pIdx->nColumn==1 );
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pIdx->aiColumn[0]==i ){
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pIdx->azColl[0] = p->aCol[i].zColl;
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, zColl);
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function returns the collation sequence for database native text
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** encoding identified by the string zName, length nName.
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the requested collation sequence is not available, or not available
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the database native encoding, the collation factory is invoked to
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** request it. If the collation factory does not supply such a sequence,
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and the sequence is available in another text encoding, then that is
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** returned instead.
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If no versions of the requested collations sequence are available, or
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** another error occurs, NULL is returned and an error message written into
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pParse.
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is a wrapper around sqlite3FindCollSeq().  This routine
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** invokes the collation factory if the named collation cannot be found
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and generates an error message.
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq()
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 enc = ENC(db);
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 initbusy = db->init.busy;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CollSeq *pColl;
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pColl = sqlite3FindCollSeq(db, enc, zName, initbusy);
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !initbusy && (!pColl || !pColl->xCmp) ){
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pColl = sqlite3GetCollSeq(db, enc, pColl, zName);
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !pColl ){
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName);
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pColl;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that will increment the schema cookie.
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The schema cookie is used to determine when the schema for the
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database changes.  After each schema change, the cookie value
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** changes.  When a process first reads the schema it records the
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cookie.  Thereafter, whenever it goes to access the database,
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it checks the cookie to make sure the schema has not changed
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** since it was last read.
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This plan is not completely bullet-proof.  It is possible for
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the schema to change multiple times and for the cookie to be
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** set back to prior value.  But schema changes are infrequent
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and the probability of hitting the same cookie value is only
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1 chance in 2^32.  So we're safe enough.
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ChangeCookie(Parse *pParse, int iDb){
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int r1 = sqlite3GetTempReg(pParse);
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = pParse->pVdbe;
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp2(v, OP_Integer, db->aDb[iDb].pSchema->schema_cookie+1, r1);
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, r1);
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ReleaseTempReg(pParse, r1);
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Measure the number of characters needed to output the given
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** identifier.  The number returned includes any quotes used
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** but does not include the null terminator.
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The estimate is conservative.  It might be larger that what is
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** really needed.
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int identLength(const char *z){
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(n=0; *z; n++, z++){
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( *z=='"' ){ n++; }
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return n + 2;
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The first parameter is a pointer to an output buffer. The second
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parameter is a pointer to an integer that contains the offset at
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** which to write into the output buffer. This function copies the
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** nul-terminated string pointed to by the third parameter, zSignedIdent,
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the specified offset in the buffer and updates *pIdx to refer
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the first byte after the last byte written before returning.
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the string zSignedIdent consists entirely of alpha-numeric
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** characters, does not begin with a digit and is not an SQL keyword,
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then it is copied to the output buffer exactly as it is. Otherwise,
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it is quoted using double-quotes.
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void identPut(char *z, int *pIdx, char *zSignedIdent){
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char *zIdent = (unsigned char*)zSignedIdent;
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i, j, needQuote;
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i = *pIdx;
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(j=0; zIdent[j]; j++){
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !sqlite3Isalnum(zIdent[j]) && zIdent[j]!='_' ) break;
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  needQuote = sqlite3Isdigit(zIdent[0]) || sqlite3KeywordCode(zIdent, j)!=TK_ID;
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !needQuote ){
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    needQuote = zIdent[j];
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( needQuote ) z[i++] = '"';
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(j=0; zIdent[j]; j++){
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    z[i++] = zIdent[j];
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zIdent[j]=='"' ) z[i++] = '"';
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( needQuote ) z[i++] = '"';
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z[i] = 0;
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *pIdx = i;
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate a CREATE TABLE statement appropriate for the given
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table.  Memory to hold the text of the statement is obtained
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from sqliteMalloc() and must be freed by the calling function.
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *createTableStmt(sqlite3 *db, Table *p){
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i, k, n;
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zStmt;
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zSep, *zSep2, *zEnd;
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Column *pCol;
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = 0;
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pCol = p->aCol, i=0; i<p->nCol; i++, pCol++){
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n += identLength(pCol->zName) + 5;
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n += identLength(p->zName);
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( n<50 ){
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zSep = "";
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zSep2 = ",";
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zEnd = ")";
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zSep = "\n  ";
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zSep2 = ",\n  ";
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zEnd = "\n)";
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n += 35 + 6*p->nCol;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zStmt = sqlite3DbMallocRaw(0, n);
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zStmt==0 ){
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->mallocFailed = 1;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_snprintf(n, zStmt, "CREATE TABLE ");
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  k = sqlite3Strlen30(zStmt);
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  identPut(zStmt, &k, p->zName);
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zStmt[k++] = '(';
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pCol=p->aCol, i=0; i<p->nCol; i++, pCol++){
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const char * const azType[] = {
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* SQLITE_AFF_TEXT    */ " TEXT",
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* SQLITE_AFF_NONE    */ "",
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* SQLITE_AFF_NUMERIC */ " NUM",
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* SQLITE_AFF_INTEGER */ " INT",
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* SQLITE_AFF_REAL    */ " REAL"
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len;
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zType;
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_snprintf(n-k, &zStmt[k], zSep);
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k += sqlite3Strlen30(&zStmt[k]);
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zSep = zSep2;
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    identPut(zStmt, &k, pCol->zName);
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pCol->affinity-SQLITE_AFF_TEXT >= 0 );
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pCol->affinity-SQLITE_AFF_TEXT < ArraySize(azType) );
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( pCol->affinity==SQLITE_AFF_TEXT );
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( pCol->affinity==SQLITE_AFF_NONE );
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( pCol->affinity==SQLITE_AFF_NUMERIC );
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( pCol->affinity==SQLITE_AFF_INTEGER );
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( pCol->affinity==SQLITE_AFF_REAL );
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zType = azType[pCol->affinity - SQLITE_AFF_TEXT];
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = sqlite3Strlen30(zType);
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pCol->affinity==SQLITE_AFF_NONE
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            || pCol->affinity==sqlite3AffinityType(zType) );
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(&zStmt[k], zType, len);
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k += len;
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( k<=n );
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd);
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return zStmt;
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called to report the final ")" that terminates
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a CREATE TABLE statement.
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The table structure that other action routines have been building
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is added to the internal hash tables, assuming no errors have
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** occurred.
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An entry for the table is made in the master table on disk, unless
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this is a temporary table or db->init.busy==1.  When db->init.busy==1
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it means we are reading the sqlite_master table because we just
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** connected to the database or because the sqlite_master table has
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** recently changed, so the entry for this table already exists in
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the sqlite_master table.  We do not want to create it again.
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the pSelect argument is not NULL, it means that this routine
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** was called to create a table generated from a
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "CREATE TABLE ... AS SELECT ..." statement.  The column names of
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the new table will match the result set of the SELECT.
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3EndTable(
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,          /* Parse context */
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pCons,           /* The ',' token after the last column defn. */
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pEnd,            /* The final ')' token in the CREATE TABLE */
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Select *pSelect         /* Select from a "CREATE ... AS SELECT" */
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *p;
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pEnd==0 && pSelect==0) || db->mallocFailed ){
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = pParse->pNewTable;
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 ) return;
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !db->init.busy || !pSelect );
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iDb = sqlite3SchemaToIndex(db, p->pSchema);
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CHECK
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Resolve names in all CHECK constraint expressions.
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->pCheck ){
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SrcList sSrc;                   /* Fake SrcList for pParse->pNewTable */
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NameContext sNC;                /* Name context for pParse->pNewTable */
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(&sNC, 0, sizeof(sNC));
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(&sSrc, 0, sizeof(sSrc));
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sSrc.nSrc = 1;
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sSrc.a[0].zName = p->zName;
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sSrc.a[0].pTab = p;
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sSrc.a[0].iCursor = -1;
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sNC.pParse = pParse;
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sNC.pSrcList = &sSrc;
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sNC.isCheck = 1;
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3ResolveExprNames(&sNC, p->pCheck) ){
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_CHECK) */
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If the db->init.busy is 1 it means we are reading the SQL off the
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** "sqlite_master" or "sqlite_temp_master" table on the disk.
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** So do not write to the disk again.  Extract the root page number
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** for the table from the db->init.newTnum field.  (The page number
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** should have been put there by the sqliteOpenCb routine.)
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->init.busy ){
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->tnum = db->init.newTnum;
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If not initializing, then create a record for the new table
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** in the SQLITE_MASTER table of the database.
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** If this is a TEMPORARY table, write the entry into the auxiliary
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** file instead of into the main database file.
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !db->init.busy ){
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int n;
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vdbe *v;
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zType;    /* "view" or "table" */
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zType2;   /* "VIEW" or "TABLE" */
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zStmt;    /* Text of the CREATE TABLE or CREATE VIEW statement */
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v = sqlite3GetVdbe(pParse);
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( NEVER(v==0) ) return;
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp1(v, OP_Close, 0);
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /*
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Initialize zType for the new view or table.
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->pSelect==0 ){
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* A regular table */
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zType = "table";
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zType2 = "TABLE";
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIEW
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* A view */
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zType = "view";
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zType2 = "VIEW";
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** statement to populate the new table. The root-page number for the
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** new table is in register pParse->regRoot.
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Once the SELECT has been coded by sqlite3Select(), it is in a
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** suitable state to query for the column names and types to be used
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** by the new table.
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** A shared-cache write-lock is not required to write to the new table,
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** as a schema-lock must have already been obtained to create it. Since
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** a schema-lock excludes all other database users, the write-lock would
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** be redundant.
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pSelect ){
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SelectDest dest;
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Table *pSelTab;
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(pParse->nTab==1);
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb);
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeChangeP5(v, 1);
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pParse->nTab = 2;
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3SelectDestInit(&dest, SRT_Table, 1);
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3Select(pParse, pSelect, &dest);
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp1(v, OP_Close, 1);
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pParse->nErr==0 ){
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect);
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( pSelTab==0 ) return;
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( p->aCol==0 );
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->nCol = pSelTab->nCol;
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->aCol = pSelTab->aCol;
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pSelTab->nCol = 0;
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pSelTab->aCol = 0;
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3DeleteTable(db, pSelTab);
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Compute the complete text of the CREATE statement */
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pSelect ){
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zStmt = createTableStmt(db, p);
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      n = (int)(pEnd->z - pParse->sNameToken.z) + 1;
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zStmt = sqlite3MPrintf(db,
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "CREATE %s %.*s", zType2, n, pParse->sNameToken.z
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* A slot for the record has already been allocated in the
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** SQLITE_MASTER table.  We just need to update that slot with all
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the information we've collected.
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3NestedParse(pParse,
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "UPDATE %Q.%s "
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q "
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "WHERE rowid=#%d",
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zType,
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->zName,
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->zName,
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pParse->regRoot,
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zStmt,
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pParse->regRowid
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    );
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, zStmt);
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ChangeCookie(pParse, iDb);
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINCREMENT
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Check to see if we need to create an sqlite_sequence table for
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** keeping track of autoincrement keys.
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->tabFlags & TF_Autoincrement ){
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Db *pDb = &db->aDb[iDb];
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pDb->pSchema->pSeqTab==0 ){
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3NestedParse(pParse,
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "CREATE TABLE %Q.sqlite_sequence(name,seq)",
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pDb->zName
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        );
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Reparse everything to update our internal data structures */
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp4(v, OP_ParseSchema, iDb, 0, 0,
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3MPrintf(db, "tbl_name='%q'",p->zName), P4_DYNAMIC);
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Add the table to the in-memory representation of the database.
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->init.busy ){
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Table *pOld;
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Schema *pSchema = p->pSchema;
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName,
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             sqlite3Strlen30(p->zName),p);
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOld ){
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( p==pOld );  /* Malloc must have failed inside HashInsert() */
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->mallocFailed = 1;
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->pNewTable = 0;
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->nTable++;
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->flags |= SQLITE_InternChanges;
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_ALTERTABLE
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !p->pSelect ){
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char *zName = (const char *)pParse->sNameToken.z;
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int nName;
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !pSelect && pCons && pEnd );
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pCons->z==0 ){
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pCons = pEnd;
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nName = (int)((const char *)pCons->z - zName);
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->addColOffset = 13 + sqlite3Utf8CharLen(zName, nName);
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIEW
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The parser calls this routine in order to create a new VIEW
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3CreateView(
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,     /* The parsing context */
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pBegin,     /* The CREATE token that begins the statement */
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName1,     /* The token that holds the name of the view */
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName2,     /* The token that holds the name of the view */
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Select *pSelect,   /* A SELECT statement that will become the new view */
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int isTemp,        /* TRUE for a TEMPORARY view */
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int noErr          /* Suppress error messages if VIEW already exists */
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *p;
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n;
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *z;
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token sEnd;
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DbFixer sFix;
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName;
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pParse->nVar>0 ){
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "parameters are not allowed in views");
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SelectDelete(db, pSelect);
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr);
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = pParse->pNewTable;
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 || pParse->nErr ){
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SelectDelete(db, pSelect);
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3TwoPartName(pParse, pName1, pName2, &pName);
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iDb = sqlite3SchemaToIndex(db, p->pSchema);
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3FixInit(&sFix, pParse, iDb, "view", pName)
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    && sqlite3FixSelect(&sFix, pSelect)
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ){
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SelectDelete(db, pSelect);
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Make a copy of the entire SELECT statement that defines the view.
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** This will force all the Expr.token.z values to be dynamically
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** allocated rather than point to the input string - which means that
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** they will persist after the current sqlite3_exec() call returns.
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3SelectDelete(db, pSelect);
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed ){
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !db->init.busy ){
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ViewGetColumnNames(pParse, p);
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Locate the end of the CREATE VIEW statement.  Make sEnd point to
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the end.
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sEnd = pParse->sLastToken;
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(sEnd.z[0]!=0) && sEnd.z[0]!=';' ){
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sEnd.z += sEnd.n;
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sEnd.n = 0;
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = (int)(sEnd.z - pBegin->z);
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = pBegin->z;
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( ALWAYS(n>0) && sqlite3Isspace(z[n-1]) ){ n--; }
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sEnd.z = &z[n-1];
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sEnd.n = 1;
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Use sqlite3EndTable() to add the view to the SQLITE_MASTER table */
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3EndTable(pParse, 0, &sEnd, 0);
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return;
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIEW */
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The Table structure pTable is really a VIEW.  Fill in the names of
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the columns of the view in the pTable structure.  Return the number
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of errors.  If an error is seen leave an error message in pParse->zErrMsg.
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pSelTab;   /* A fake table from which we get the result set */
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Select *pSel;     /* Copy of the SELECT that implements the view */
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nErr = 0;     /* Number of errors encountered */
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n;            /* Temporarily holds the number of cursors assigned */
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;  /* Database connection for malloc errors */
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int (*xAuth)(void*,int,const char*,const char*,const char*,const char*);
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pTable );
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3VtabCallConnect(pParse, pTable) ){
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SQLITE_ERROR;
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( IsVirtual(pTable) ) return 0;
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIEW
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* A positive nCol means the columns names for this view are
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** already known.
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTable->nCol>0 ) return 0;
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* A negative nCol is a special marker meaning that we are currently
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** trying to compute the column names.  If we enter this routine with
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** a negative nCol, it means two or more views form a loop, like this:
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **     CREATE VIEW one AS SELECT * FROM two;
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **     CREATE VIEW two AS SELECT * FROM one;
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Actually, the error above is now caught prior to reaching this point.
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** But the following test is still important as it does come up
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** in the following:
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **     CREATE TABLE main.ex1(a);
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **     CREATE TEMP VIEW ex1 AS SELECT a FROM ex1;
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **     SELECT * FROM temp.ex1;
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTable->nCol<0 ){
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "view %s is circularly defined", pTable->zName);
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pTable->nCol>=0 );
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If we get this far, it means we need to compute the table names.
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Note that the call to sqlite3ResultSetOfSelect() will expand any
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** "*" elements in the results set of the view and will assign cursors
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** to the elements of the FROM clause.  But we do not want these changes
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** to be permanent.  So the computation is done on a copy of the SELECT
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** statement that defines the view.
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pTable->pSelect );
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pSel = sqlite3SelectDup(db, pTable->pSelect, 0);
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pSel ){
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    u8 enableLookaside = db->lookaside.bEnabled;
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n = pParse->nTab;
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SrcListAssignCursors(pParse, pSel->pSrc);
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTable->nCol = -1;
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->lookaside.bEnabled = 0;
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTHORIZATION
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xAuth = db->xAuth;
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->xAuth = 0;
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pSelTab = sqlite3ResultSetOfSelect(pParse, pSel);
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->xAuth = xAuth;
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pSelTab = sqlite3ResultSetOfSelect(pParse, pSel);
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->lookaside.bEnabled = enableLookaside;
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->nTab = n;
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pSelTab ){
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pTable->aCol==0 );
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTable->nCol = pSelTab->nCol;
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTable->aCol = pSelTab->aCol;
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pSelTab->nCol = 0;
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pSelTab->aCol = 0;
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DeleteTable(db, pSelTab);
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( sqlite3SchemaMutexHeld(db, 0, pTable->pSchema) );
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTable->pSchema->flags |= DB_UnresetViews;
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTable->nCol = 0;
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nErr++;
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SelectDelete(db, pSel);
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nErr++;
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIEW */
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return nErr;
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIEW
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Clear the column names from every VIEW in database idx.
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sqliteViewResetAll(sqlite3 *db, int idx){
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HashElem *i;
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3SchemaMutexHeld(db, idx, 0) );
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !DbHasProperty(db, idx, DB_UnresetViews) ) return;
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Table *pTab = sqliteHashData(i);
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pTab->pSelect ){
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqliteDeleteColumnNames(db, pTab);
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTab->aCol = 0;
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTab->nCol = 0;
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DbClearProperty(db, idx, DB_UnresetViews);
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqliteViewResetAll(A,B)
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIEW */
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is called by the VDBE to adjust the internal schema
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used by SQLite when the btree layer moves a table root page. The
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** root-page of a table or index in database iDb has changed from iFrom
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to iTo.
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Ticket #1728:  The symbol table might still contain information
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on tables and/or indices that are the process of being deleted.
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If you are unlucky, one of those deleted indices or tables might
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** have the same rootpage number as the real table or index that is
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** being moved.  So we cannot stop searching after the first match
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** because the first match might be for one of the deleted indices
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or tables and not the table/index that is actually being moved.
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** We must continue looping until all tables and indices with
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** rootpage==iFrom have been converted to have a rootpage of iTo
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in order to be certain that we got the right one.
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOVACUUM
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iTo){
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HashElem *pElem;
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Hash *pHash;
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Db *pDb;
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pDb = &db->aDb[iDb];
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pHash = &pDb->pSchema->tblHash;
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Table *pTab = sqliteHashData(pElem);
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pTab->tnum==iFrom ){
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTab->tnum = iTo;
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pHash = &pDb->pSchema->idxHash;
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Index *pIdx = sqliteHashData(pElem);
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pIdx->tnum==iFrom ){
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pIdx->tnum = iTo;
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write code to erase the table with root-page iTable from database iDb.
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Also write code to modify the sqlite_master table and internal schema
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if a root-page of another table is moved by the btree-layer whilst
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** erasing iTable (this can happen with an auto-vacuum database).
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void destroyRootPage(Parse *pParse, int iTable, int iDb){
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = sqlite3GetVdbe(pParse);
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int r1 = sqlite3GetTempReg(pParse);
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb);
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3MayAbort(pParse);
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOVACUUM
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* OP_Destroy stores an in integer r1. If this integer
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** is non-zero, then it is the root page number of a table moved to
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** location iTable. The following code modifies the sqlite_master table to
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** reflect this.
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** The "#NNN" in the SQL is a special constant that means whatever value
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** is in register NNN.  See grammar rules associated with the TK_REGISTER
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** token for additional information.
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3NestedParse(pParse,
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     "UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d",
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     pParse->db->aDb[iDb].zName, SCHEMA_TABLE(iDb), iTable, r1, r1);
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ReleaseTempReg(pParse, r1);
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write VDBE code to erase table pTab and all associated indices on disk.
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Code to update the sqlite_master tables and internal schema definitions
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in case a root-page belonging to another table is moved by the btree layer
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is also added (this can happen with an auto-vacuum database).
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void destroyTable(Parse *pParse, Table *pTab){
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_AUTOVACUUM
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Index *pIdx;
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destroyRootPage(pParse, pTab->tnum, iDb);
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    destroyRootPage(pParse, pIdx->tnum, iDb);
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If the database may be auto-vacuum capable (if SQLITE_OMIT_AUTOVACUUM
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** is not defined), then it is important to call OP_Destroy on the
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** table and index root-pages in order, starting with the numerically
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** largest root-page number. This guarantees that none of the root-pages
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** to be destroyed is relocated by an earlier OP_Destroy. i.e. if the
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** following were coded:
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** OP_Destroy 4 0
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** ...
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** OP_Destroy 5 0
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** and root page 5 happened to be the largest root-page number in the
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** database, then root page 5 would be moved to page 4 by the
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** "OP_Destroy 4 0" opcode. The subsequent "OP_Destroy 5 0" would hit
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** a free-list page.
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iTab = pTab->tnum;
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDestroyed = 0;
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( 1 ){
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Index *pIdx;
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int iLargest = 0;
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( iDestroyed==0 || iTab<iDestroyed ){
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iLargest = iTab;
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int iIdx = pIdx->tnum;
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pIdx->pSchema==pTab->pSchema );
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( (iDestroyed==0 || (iIdx<iDestroyed)) && iIdx>iLargest ){
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iLargest = iIdx;
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( iLargest==0 ){
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      destroyRootPage(pParse, iLargest, iDb);
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iDestroyed = iLargest;
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called to do the work of a DROP TABLE statement.
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pName is the name of the table to be dropped.
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTab;
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v;
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed ){
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_drop_table;
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pParse->nErr==0 );
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pName->nSrc==1 );
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( noErr ) db->suppressErr++;
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTab = sqlite3LocateTable(pParse, isView,
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            pName->a[0].zName, pName->a[0].zDatabase);
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( noErr ) db->suppressErr--;
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTab==0 ){
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( noErr ) sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase);
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_drop_table;
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iDb>=0 && iDb<db->nDb );
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If pTab is a virtual table, call ViewGetColumnNames() to ensure
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** it is initialized.
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( IsVirtual(pTab) && sqlite3ViewGetColumnNames(pParse, pTab) ){
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_drop_table;
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTHORIZATION
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int code;
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zTab = SCHEMA_TABLE(iDb);
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zDb = db->aDb[iDb].zName;
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zArg2 = 0;
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_drop_table;
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( isView ){
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !OMIT_TEMPDB && iDb==1 ){
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        code = SQLITE_DROP_TEMP_VIEW;
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        code = SQLITE_DROP_VIEW;
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( IsVirtual(pTab) ){
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      code = SQLITE_DROP_VTABLE;
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zArg2 = sqlite3GetVTable(db, pTab)->pMod->zName;
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !OMIT_TEMPDB && iDb==1 ){
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        code = SQLITE_DROP_TEMP_TABLE;
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        code = SQLITE_DROP_TABLE;
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3AuthCheck(pParse, code, pTab->zName, zArg2, zDb) ){
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_drop_table;
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_drop_table;
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName);
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_drop_table;
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIEW
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** on a table.
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( isView && pTab->pSelect==0 ){
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName);
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_drop_table;
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !isView && pTab->pSelect ){
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName);
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_drop_table;
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Generate code to remove the table from the master table
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** on disk.
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v = sqlite3GetVdbe(pParse);
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( v ){
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Trigger *pTrigger;
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Db *pDb = &db->aDb[iDb];
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3BeginWriteOperation(pParse, 1, iDb);
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( IsVirtual(pTab) ){
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp0(v, OP_VBegin);
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3FkDropTable(pParse, pName, pTab);
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Drop all triggers associated with the table being dropped. Code
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** is generated to remove entries from sqlite_master and/or
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** sqlite_temp_master if required.
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTrigger = sqlite3TriggerList(pParse, pTab);
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while( pTrigger ){
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pTrigger->pSchema==pTab->pSchema ||
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pTrigger->pSchema==db->aDb[1].pSchema );
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DropTriggerPtr(pParse, pTrigger);
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTrigger = pTrigger->pNext;
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINCREMENT
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Remove any entries of the sqlite_sequence table associated with
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the table being dropped. This is done before the table is dropped
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** at the btree level, in case the sqlite_sequence table needs to
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** move as a result of the drop (can happen in auto-vacuum mode).
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pTab->tabFlags & TF_Autoincrement ){
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3NestedParse(pParse,
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "DELETE FROM %s.sqlite_sequence WHERE name=%Q",
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pDb->zName, pTab->zName
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Drop all SQLITE_MASTER table and index entries that refer to the
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** table. The program name loops through the master table and deletes
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** every row that refers to a table of the same name as the one being
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** dropped. Triggers are handled seperately because a trigger can be
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** created in the temp database that refers to a table in another
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** database.
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3NestedParse(pParse,
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'",
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pDb->zName, SCHEMA_TABLE(iDb), pTab->zName);
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Drop any statistics from the sqlite_stat1 table, if it exists */
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3FindTable(db, "sqlite_stat1", db->aDb[iDb].zName) ){
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3NestedParse(pParse,
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "DELETE FROM %Q.sqlite_stat1 WHERE tbl=%Q", pDb->zName, pTab->zName
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !isView && !IsVirtual(pTab) ){
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      destroyTable(pParse, pTab);
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Remove the table entry from SQLite's internal schema and modify
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the schema cookie.
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( IsVirtual(pTab) ){
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0);
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0);
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ChangeCookie(pParse, iDb);
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqliteViewResetAll(db, iDb);
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_drop_table:
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3SrcListDelete(db, pName);
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called to create a new foreign key on the table
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** currently under construction.  pFromCol determines which columns
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the current table point to the foreign key.  If pFromCol==0 then
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** connect the key to the last column inserted.  pTo is the name of
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the table referred to.  pToCol is a list of tables in the other
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pTo table that the foreign key points to.  flags contains all
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** information about the conflict resolution algorithms specified
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the ON DELETE, ON UPDATE and ON INSERT clauses.
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An FKey structure is created and added to the table currently
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** under construction in the pParse->pNewTable field.
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The foreign key is set for IMMEDIATE processing.  A subsequent call
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to sqlite3DeferForeignKey() might change this to DEFERRED.
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3CreateForeignKey(
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,       /* Parsing context */
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprList *pFromCol,  /* Columns in this table that point to other table */
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pTo,          /* Name of the other table */
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprList *pToCol,    /* Columns in the other table */
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags            /* Conflict resolution algorithms. */
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FOREIGN_KEY
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FKey *pFKey = 0;
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FKey *pNextTo;
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *p = pParse->pNewTable;
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nByte;
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nCol;
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pTo!=0 );
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 || IN_DECLARE_VTAB ) goto fk_end;
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pFromCol==0 ){
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int iCol = p->nCol-1;
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( NEVER(iCol<0) ) goto fk_end;
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pToCol && pToCol->nExpr!=1 ){
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "foreign key on %s"
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         " should reference only one column of table %T",
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         p->aCol[iCol].zName, pTo);
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto fk_end;
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nCol = 1;
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pToCol && pToCol->nExpr!=pFromCol->nExpr ){
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse,
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "number of columns in foreign key does not match the number of "
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "columns in the referenced table");
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto fk_end;
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nCol = pFromCol->nExpr;
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nByte = sizeof(*pFKey) + (nCol-1)*sizeof(pFKey->aCol[0]) + pTo->n + 1;
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pToCol ){
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<pToCol->nExpr; i++){
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nByte += sqlite3Strlen30(pToCol->a[i].zName) + 1;
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFKey = sqlite3DbMallocZero(db, nByte );
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pFKey==0 ){
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto fk_end;
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFKey->pFrom = p;
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFKey->pNextFrom = p->pFKey;
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = (char*)&pFKey->aCol[nCol];
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFKey->zTo = z;
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(z, pTo->z, pTo->n);
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z[pTo->n] = 0;
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3Dequote(z);
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z += pTo->n+1;
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFKey->nCol = nCol;
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pFromCol==0 ){
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFKey->aCol[0].iFrom = p->nCol-1;
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<nCol; i++){
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int j;
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(j=0; j<p->nCol; j++){
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zName)==0 ){
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pFKey->aCol[i].iFrom = j;
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( j>=p->nCol ){
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ErrorMsg(pParse,
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "unknown column \"%s\" in foreign key definition",
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pFromCol->a[i].zName);
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto fk_end;
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pToCol ){
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<nCol; i++){
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int n = sqlite3Strlen30(pToCol->a[i].zName);
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pFKey->aCol[i].zCol = z;
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(z, pToCol->a[i].zName, n);
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      z[n] = 0;
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      z += n+1;
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFKey->isDeferred = 0;
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFKey->aAction[0] = (u8)(flags & 0xff);            /* ON DELETE action */
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFKey->aAction[1] = (u8)((flags >> 8 ) & 0xff);    /* ON UPDATE action */
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3SchemaMutexHeld(db, 0, p->pSchema) );
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pNextTo = (FKey *)sqlite3HashInsert(&p->pSchema->fkeyHash,
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pFKey->zTo, sqlite3Strlen30(pFKey->zTo), (void *)pFKey
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pNextTo==pFKey ){
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->mallocFailed = 1;
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto fk_end;
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pNextTo ){
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pNextTo->pPrevTo==0 );
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFKey->pNextTo = pNextTo;
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNextTo->pPrevTo = pFKey;
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Link the foreign key to the table as the last step.
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->pFKey = pFKey;
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFKey = 0;
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fk_end:
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, pFKey);
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprListDelete(db, pFromCol);
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprListDelete(db, pToCol);
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called when an INITIALLY IMMEDIATE or INITIALLY DEFERRED
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** clause is seen as part of a foreign key definition.  The isDeferred
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parameter is 1 for INITIALLY DEFERRED and 0 for INITIALLY IMMEDIATE.
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The behavior of the most recently created foreign key is adjusted
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** accordingly.
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FOREIGN_KEY
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTab;
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FKey *pFKey;
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return;
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( isDeferred==0 || isDeferred==1 ); /* EV: R-30323-21917 */
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFKey->isDeferred = (u8)isDeferred;
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that will erase and refill index *pIdx.  This is
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used to initialize a newly created index or to recompute the
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** content of an index in response to a REINDEX command.
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if memRootPage is not negative, it means that the index is newly
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** created.  The register specified by memRootPage contains the
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** root page number of the index.  If memRootPage is negative, then
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the index already exists and must be cleared before being refilled and
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the root page number of the index is taken from pIndex->tnum.
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTab = pIndex->pTable;  /* The table that is indexed */
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iTab = pParse->nTab++;     /* Btree cursor used for pTab */
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iIdx = pParse->nTab++;     /* Btree cursor used for pIndex */
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int addr1;                     /* Address of top of loop */
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tnum;                      /* Root page of index */
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v;                       /* Generate code into this virtual machine */
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeyInfo *pKey;                 /* KeyInfo for index */
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int regIdxKey;                 /* Registers containing the index key */
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int regRecord;                 /* Register holding assemblied index record */
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;      /* The database connection */
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTHORIZATION
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0,
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->aDb[iDb].zName ) ){
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Require a write-lock on the table to perform this operation */
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName);
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v = sqlite3GetVdbe(pParse);
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( v==0 ) return;
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( memRootPage>=0 ){
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tnum = memRootPage;
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tnum = pIndex->tnum;
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_Clear, tnum, iDb);
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pKey = sqlite3IndexKeyinfo(pParse, pIndex);
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp4(v, OP_OpenWrite, iIdx, tnum, iDb,
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    (char *)pKey, P4_KEYINFO_HANDOFF);
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( memRootPage>=0 ){
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeChangeP5(v, 1);
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0);
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  regRecord = sqlite3GetTempReg(pParse);
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  regIdxKey = sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIndex->onError!=OE_None ){
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int regRowid = regIdxKey + pIndex->nColumn;
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int j2 = sqlite3VdbeCurrentAddr(v) + 2;
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void * const pRegKey = SQLITE_INT_TO_PTR(regIdxKey);
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The registers accessed by the OP_IsUnique opcode were allocated
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** using sqlite3GetTempRange() inside of the sqlite3GenerateIndexKey()
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** call above. Just before that function was freed they were released
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** (made available to the compiler for reuse) using
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** sqlite3ReleaseTempRange(). So in some ways having the OP_IsUnique
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** opcode use the values stored within seems dangerous. However, since
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** we can be sure that no other temp registers have been allocated
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** since sqlite3ReleaseTempRange() was called, it is safe to do so.
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp4(v, OP_IsUnique, iIdx, j2, regRowid, pRegKey, P4_INT32);
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3HaltConstraint(
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pParse, OE_Abort, "indexed columns are not unique", P4_STATIC);
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdx, regRecord);
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ReleaseTempReg(pParse, regRecord);
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1);
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeJumpHere(v, addr1);
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp1(v, OP_Close, iTab);
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp1(v, OP_Close, iIdx);
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Create a new index for an SQL table.  pName1.pName2 is the name of the index
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and pTblList is the name of the table that is to be indexed.  Both will
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be NULL for a primary key or an index that is created to satisfy a
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** UNIQUE constraint.  If pTable and pIndex are NULL, use pParse->pNewTable
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** as the table to be indexed.  pParse->pNewTable is a table that is
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** currently being constructed by a CREATE TABLE statement.
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pList is a list of columns to be indexed.  pList will be NULL if this
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a primary key or unique-constraint on the most recent column added
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the table currently under construction.
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the index is created successfully, return a pointer to the new Index
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** structure. This is used by sqlite3AddPrimaryKey() to mark the index
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** as the tables primary key (Index.autoIndex==2).
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Index *sqlite3CreateIndex(
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,     /* All information about this parse */
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName1,     /* First part of index name. May be NULL */
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName2,     /* Second part of index name. May be NULL */
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SrcList *pTblName, /* Table to index. Use pParse->pNewTable if 0 */
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExprList *pList,   /* A list of columns to be indexed */
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int onError,       /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pStart,     /* The CREATE token that begins this statement */
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pEnd,       /* The ")" that closes the CREATE INDEX statement */
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int sortOrder,     /* Sort order of primary key when pList==NULL */
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ifNotExist     /* Omit error if index already exists */
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Index *pRet = 0;     /* Pointer to return */
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTab = 0;     /* Table to be indexed */
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Index *pIndex = 0;   /* The index to be created */
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zName = 0;     /* Name of the index */
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nName;           /* Number of characters in zName */
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i, j;
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token nullId;        /* Fake token for an empty ID list */
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DbFixer sFix;        /* For assigning database names to pTable */
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int sortOrderMask;   /* 1 to honor DESC in index.  0 to ignore. */
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Db *pDb;             /* The specific table containing the indexed database */
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;             /* Index of the database that is being written */
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pName = 0;    /* Unqualified name of the index to create */
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ExprList_item *pListItem; /* For looping over pList */
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nCol;
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nExtra = 0;
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zExtra;
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pStart==0 || pEnd!=0 ); /* pEnd must be non-NULL if pStart is */
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pParse->nErr==0 );      /* Never called with prior errors */
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed || IN_DECLARE_VTAB ){
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_create_index;
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_create_index;
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Find the table that is to be indexed.  Return early if not found.
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTblName!=0 ){
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Use the two-part index name to determine the database
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** to search for the table. 'Fix' the table name to this db
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** before looking up the table.
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pName1 && pName2 );
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( iDb<0 ) goto exit_create_index;
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TEMPDB
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If the index name was unqualified, check if the the table
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** is a temp table. If so, set the database to 1. Do not do this
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** if initialising a database schema.
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !db->init.busy ){
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTab = sqlite3SrcListLookup(pParse, pTblName);
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iDb = 1;
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3FixInit(&sFix, pParse, iDb, "index", pName) &&
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3FixSrcList(&sFix, pTblName)
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ){
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Because the parser constructs pTblName from a single identifier,
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** sqlite3FixSrcList can never fail. */
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert(0);
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTab = sqlite3LocateTable(pParse, 0, pTblName->a[0].zName,
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pTblName->a[0].zDatabase);
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !pTab || db->mallocFailed ) goto exit_create_index;
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( db->aDb[iDb].pSchema==pTab->pSchema );
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pName==0 );
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTab = pParse->pNewTable;
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !pTab ) goto exit_create_index;
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pDb = &db->aDb[iDb];
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pTab!=0 );
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pParse->nErr==0 );
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0
2480b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)       && sqlite3StrNICmp(&pTab->zName[7],"altertab_",9)!=0 ){
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName);
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_create_index;
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIEW
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTab->pSelect ){
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "views may not be indexed");
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_create_index;
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( IsVirtual(pTab) ){
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "virtual tables may not be indexed");
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_create_index;
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Find the name of the index.  Make sure there is not already another
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** index or table with the same name.
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Exception:  If we are reading the names of permanent indices from the
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sqlite_master table (because some other process changed the schema) and
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** one of the index names collides with the name of a temporary table or
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** index, then we will continue to process this index.
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** If pName==0 it means that we are
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** dealing with a primary key or UNIQUE constraint.  We have to invent our
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** own name.
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pName ){
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zName = sqlite3NameFromToken(db, pName);
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zName==0 ) goto exit_create_index;
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_create_index;
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !db->init.busy ){
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3FindTable(db, zName, 0)!=0 ){
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ErrorMsg(pParse, "there is already a table named %s", zName);
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto exit_create_index;
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3FindIndex(db, zName, pDb->zName)!=0 ){
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !ifNotExist ){
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3ErrorMsg(pParse, "index %s already exists", zName);
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( !db->init.busy );
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3CodeVerifySchema(pParse, iDb);
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_create_index;
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int n;
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Index *pLoop;
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, n++){}
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zName = sqlite3MPrintf(db, "sqlite_autoindex_%s_%d", pTab->zName, n);
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zName==0 ){
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_create_index;
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Check for authorization to create an index.
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTHORIZATION
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zDb = pDb->zName;
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_create_index;
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i = SQLITE_CREATE_INDEX;
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !OMIT_TEMPDB && iDb==1 ) i = SQLITE_CREATE_TEMP_INDEX;
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3AuthCheck(pParse, i, zName, pTab->zName, zDb) ){
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_create_index;
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If pList==0, it means this routine was called to make a primary
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** key out of the last column added to the table under construction.
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** So create a fake list to simulate this.
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList==0 ){
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nullId.z = pTab->aCol[pTab->nCol-1].zName;
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nullId.n = sqlite3Strlen30((char*)nullId.z);
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pList = sqlite3ExprListAppend(pParse, 0, 0);
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pList==0 ) goto exit_create_index;
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprListSetName(pParse, pList, &nullId, 0);
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pList->a[0].sortOrder = (u8)sortOrder;
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Figure out how many bytes of space are required to store explicitly
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** specified collation sequence names.
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<pList->nExpr; i++){
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Expr *pExpr = pList->a[i].pExpr;
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pExpr ){
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CollSeq *pColl = pExpr->pColl;
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Either pColl!=0 or there was an OOM failure.  But if an OOM
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** failure we have quit before reaching this point. */
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( ALWAYS(pColl) ){
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nExtra += (1 + sqlite3Strlen30(pColl->zName));
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Allocate the index structure.
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nName = sqlite3Strlen30(zName);
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nCol = pList->nExpr;
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex = sqlite3DbMallocZero(db,
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sizeof(Index) +              /* Index structure  */
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sizeof(int)*nCol +           /* Index.aiColumn   */
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sizeof(int)*(nCol+1) +       /* Index.aiRowEst   */
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sizeof(char *)*nCol +        /* Index.azColl     */
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sizeof(u8)*nCol +            /* Index.aSortOrder */
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nName + 1 +                  /* Index.zName      */
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nExtra                       /* Collation sequence names */
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed ){
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_create_index;
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex->azColl = (char**)(&pIndex[1]);
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex->aiColumn = (int *)(&pIndex->azColl[nCol]);
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex->aiRowEst = (unsigned *)(&pIndex->aiColumn[nCol]);
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex->aSortOrder = (u8 *)(&pIndex->aiRowEst[nCol+1]);
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex->zName = (char *)(&pIndex->aSortOrder[nCol]);
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zExtra = (char *)(&pIndex->zName[nName+1]);
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(pIndex->zName, zName, nName+1);
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex->pTable = pTab;
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex->nColumn = pList->nExpr;
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex->onError = (u8)onError;
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex->autoIndex = (u8)(pName==0);
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex->pSchema = db->aDb[iDb].pSchema;
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Check to see if we should honor DESC requests on index columns
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pDb->pSchema->file_format>=4 ){
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sortOrderMask = -1;   /* Honor DESC */
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sortOrderMask = 0;    /* Ignore DESC */
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Scan the names of the columns of the table to be indexed and
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** load the column indices into the Index structure.  Report an error
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** if any column is not found.
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** TODO:  Add a test to make sure that the same column is not named
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** more than once within the same index.  Only the first instance of
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the column will ever be used by the optimizer.  Note that using the
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** same column more than once cannot be an error because that would
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** break backwards compatibility - it needs to be a warning.
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, pListItem=pList->a; i<pList->nExpr; i++, pListItem++){
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zColName = pListItem->zName;
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Column *pTabCol;
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int requestedSortOrder;
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zColl;                   /* Collation sequence name */
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(j=0, pTabCol=pTab->aCol; j<pTab->nCol; j++, pTabCol++){
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3StrICmp(zColName, pTabCol->zName)==0 ) break;
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( j>=pTab->nCol ){
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "table %s has no column named %s",
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pTab->zName, zColName);
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pParse->checkSchema = 1;
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_create_index;
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIndex->aiColumn[i] = j;
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Justification of the ALWAYS(pListItem->pExpr->pColl):  Because of
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the way the "idxlist" non-terminal is constructed by the parser,
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** if pListItem->pExpr is not null then either pListItem->pExpr->pColl
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** must exist or else there must have been an OOM error.  But if there
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** was an OOM error, we would never reach this point. */
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pListItem->pExpr && ALWAYS(pListItem->pExpr->pColl) ){
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int nColl;
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zColl = pListItem->pExpr->pColl->zName;
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nColl = sqlite3Strlen30(zColl) + 1;
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( nExtra>=nColl );
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(zExtra, zColl, nColl);
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zColl = zExtra;
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zExtra += nColl;
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nExtra -= nColl;
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zColl = pTab->aCol[j].zColl;
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !zColl ){
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zColl = db->pDfltColl->zName;
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_create_index;
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIndex->azColl[i] = zColl;
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    requestedSortOrder = pListItem->sortOrder & sortOrderMask;
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIndex->aSortOrder[i] = (u8)requestedSortOrder;
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DefaultRowEst(pIndex);
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTab==pParse->pNewTable ){
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* This routine has been called to create an automatic index as a
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** result of a PRIMARY KEY or UNIQUE clause on a column definition, or
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** a PRIMARY KEY or UNIQUE clause following the column definitions.
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** i.e. one of:
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** CREATE TABLE t(x PRIMARY KEY, y);
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** CREATE TABLE t(x, y, UNIQUE(x, y));
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Either way, check to see if the table already has such an index. If
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** so, don't bother creating this one. This only applies to
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** automatically created indices. Users can do as they wish with
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** explicit indices.
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Two UNIQUE or PRIMARY KEY constraints are considered equivalent
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** (and thus suppressing the second one) even if they have different
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** sort orders.
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** If there are different collating sequences or if the columns of
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the constraint occur in different orders, then the constraints are
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** considered distinct and both result in separate indices.
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Index *pIdx;
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int k;
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pIdx->onError!=OE_None );
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pIdx->autoIndex );
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pIndex->onError!=OE_None );
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pIdx->nColumn!=pIndex->nColumn ) continue;
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for(k=0; k<pIdx->nColumn; k++){
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const char *z1;
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const char *z2;
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( pIdx->aiColumn[k]!=pIndex->aiColumn[k] ) break;
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        z1 = pIdx->azColl[k];
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        z2 = pIndex->azColl[k];
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( z1!=z2 && sqlite3StrICmp(z1, z2) ) break;
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( k==pIdx->nColumn ){
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( pIdx->onError!=pIndex->onError ){
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* This constraint creates the same index as a previous
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** constraint specified somewhere in the CREATE TABLE statement.
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** However the ON CONFLICT clauses are different. If both this
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** constraint and the previous equivalent constraint have explicit
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** ON CONFLICT clauses this is an error. Otherwise, use the
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** explicitly specified behaviour for the index.
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          */
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( !(pIdx->onError==OE_Default || pIndex->onError==OE_Default) ){
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            sqlite3ErrorMsg(pParse,
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "conflicting ON CONFLICT clauses specified", 0);
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( pIdx->onError==OE_Default ){
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pIdx->onError = pIndex->onError;
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto exit_create_index;
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Link the new Index structure to its table and to the other
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** in-memory database structures.
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->init.busy ){
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Index *p;
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) );
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p = sqlite3HashInsert(&pIndex->pSchema->idxHash,
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          pIndex->zName, sqlite3Strlen30(pIndex->zName),
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          pIndex);
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p ){
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( p==pIndex );  /* Malloc must have failed */
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->mallocFailed = 1;
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_create_index;
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->flags |= SQLITE_InternChanges;
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pTblName!=0 ){
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pIndex->tnum = db->init.newTnum;
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If the db->init.busy is 0 then create the index on disk.  This
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** involves writing the index into the master table and filling in the
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** index with the current table contents.
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** The db->init.busy is 0 when the user first enters a CREATE INDEX
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** command.  db->init.busy is 1 when a database is opened and
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** CREATE INDEX statements are read out of the master table.  In
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the latter case the index already exists on disk, which is why
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** we don't want to recreate it.
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** If pTblName==0 it means this index is generated as a primary key
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** or UNIQUE constraint of a CREATE TABLE statement.  Since the table
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** has just been created, it contains no data and the index initialization
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** step can be skipped.
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else{ /* if( db->init.busy==0 ) */
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vdbe *v;
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zStmt;
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int iMem = ++pParse->nMem;
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v = sqlite3GetVdbe(pParse);
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( v==0 ) goto exit_create_index;
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Create the rootpage for the index
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3BeginWriteOperation(pParse, 1, iDb);
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_CreateIndex, iDb, iMem);
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Gather the complete text of the CREATE INDEX statement into
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the zStmt variable
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pStart ){
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pEnd!=0 );
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* A named index with an explicit CREATE INDEX statement */
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s",
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        onError==OE_None ? "" : " UNIQUE",
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pEnd->z - pName->z + 1,
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pName->z);
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* An automatic index created by a PRIMARY KEY or UNIQUE constraint */
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* zStmt = sqlite3MPrintf(""); */
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zStmt = 0;
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Add an entry in sqlite_master for this index
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3NestedParse(pParse,
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);",
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pIndex->zName,
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pTab->zName,
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iMem,
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zStmt
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    );
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, zStmt);
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Fill the index with data and reparse the schema. Code an OP_Expire
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** to invalidate all pre-compiled statements.
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pTblName ){
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3RefillIndex(pParse, pIndex, iMem);
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ChangeCookie(pParse, iDb);
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp4(v, OP_ParseSchema, iDb, 0, 0,
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName),
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         P4_DYNAMIC);
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp1(v, OP_Expire, 0);
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* When adding an index to the list of indices for a table, make
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sure all indices labeled OE_Replace come after all those labeled
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** OE_Ignore.  This is necessary for the correct constraint check
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** processing (in sqlite3GenerateConstraintChecks()) as part of
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** UPDATE and INSERT statements.
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->init.busy || pTblName==0 ){
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( onError!=OE_Replace || pTab->pIndex==0
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         || pTab->pIndex->onError==OE_Replace){
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pIndex->pNext = pTab->pIndex;
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTab->pIndex = pIndex;
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Index *pOther = pTab->pIndex;
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while( pOther->pNext && pOther->pNext->onError!=OE_Replace ){
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pOther = pOther->pNext;
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pIndex->pNext = pOther->pNext;
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pOther->pNext = pIndex;
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pRet = pIndex;
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIndex = 0;
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Clean up before exiting */
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_create_index:
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIndex ){
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pIndex->zColAff);
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pIndex);
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprListDelete(db, pList);
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3SrcListDelete(db, pTblName);
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, zName);
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pRet;
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Fill the Index.aiRowEst[] array with default information - information
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to be used when we have not run the ANALYZE command.
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** aiRowEst[0] is suppose to contain the number of elements in the index.
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Since we do not know, guess 1 million.  aiRowEst[1] is an estimate of the
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** number of rows in the table that match any particular value of the
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** first column of the index.  aiRowEst[2] is an estimate of the number
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of rows that match any particular combiniation of the first 2 columns
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the index.  And so forth.  It must always be the case that
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           aiRowEst[N]<=aiRowEst[N-1]
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           aiRowEst[N]>=1
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Apart from that, we have little to go on besides intuition as to
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** how aiRowEst[] should be initialized.  The numbers generated here
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are based on typical values found in actual indices.
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3DefaultRowEst(Index *pIdx){
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned *a = pIdx->aiRowEst;
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned n;
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( a!=0 );
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  a[0] = pIdx->pTable->nRowEst;
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( a[0]<10 ) a[0] = 10;
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = 10;
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=1; i<=pIdx->nColumn; i++){
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a[i] = n;
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( n>5 ) n--;
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIdx->onError!=OE_None ){
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a[pIdx->nColumn] = 1;
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine will drop an existing named index.  This routine
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** implements the DROP INDEX statement.
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Index *pIndex;
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v;
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pParse->nErr==0 );   /* Never called with prior errors */
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed ){
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_drop_index;
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pName->nSrc==1 );
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_drop_index;
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].zDatabase);
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIndex==0 ){
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !ifExists ){
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "no such index: %S", pName, 0);
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase);
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pParse->checkSchema = 1;
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_drop_index;
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIndex->autoIndex ){
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "index associated with UNIQUE "
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "or PRIMARY KEY constraint cannot be dropped", 0);
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto exit_drop_index;
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTHORIZATION
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int code = SQLITE_DROP_INDEX;
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Table *pTab = pIndex->pTable;
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zDb = db->aDb[iDb].zName;
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zTab = SCHEMA_TABLE(iDb);
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_drop_index;
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !OMIT_TEMPDB && iDb ) code = SQLITE_DROP_TEMP_INDEX;
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3AuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb) ){
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto exit_drop_index;
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Generate code to remove the index and from the master table */
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v = sqlite3GetVdbe(pParse);
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( v ){
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3BeginWriteOperation(pParse, 1, iDb);
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3NestedParse(pParse,
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "DELETE FROM %Q.%s WHERE name=%Q AND type='index'",
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       pIndex->zName
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    );
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3FindTable(db, "sqlite_stat1", db->aDb[iDb].zName) ){
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3NestedParse(pParse,
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "DELETE FROM %Q.sqlite_stat1 WHERE idx=%Q",
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->aDb[iDb].zName, pIndex->zName
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ChangeCookie(pParse, iDb);
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    destroyRootPage(pParse, pIndex->tnum, iDb);
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp4(v, OP_DropIndex, iDb, 0, 0, pIndex->zName, 0);
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit_drop_index:
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3SrcListDelete(db, pName);
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pArray is a pointer to an array of objects.  Each object in the
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** array is szEntry bytes in size.  This routine allocates a new
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** object on the end of the array.
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** *pnEntry is the number of entries already in use.  *pnAlloc is
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the previously allocated size of the array.  initSize is the
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** suggested initial array size allocation.
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The index of the new entry is returned in *pIdx.
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine returns a pointer to the array of objects.  This
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** might be the same as the pArray parameter or it might be a different
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pointer if the array was resized.
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void *sqlite3ArrayAllocate(
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db,      /* Connection to notify of malloc failures */
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void *pArray,     /* Array of objects.  Might be reallocated */
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int szEntry,      /* Size of each object in the array */
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int initSize,     /* Suggested initial allocation, in elements */
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int *pnEntry,     /* Number of objects currently in use */
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int *pnAlloc,     /* Current size of the allocation, in elements */
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int *pIdx         /* Write the index of a new slot here */
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( *pnEntry >= *pnAlloc ){
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *pNew;
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int newSize;
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    newSize = (*pnAlloc)*2 + initSize;
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNew = sqlite3DbRealloc(db, pArray, newSize*szEntry);
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pNew==0 ){
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *pIdx = -1;
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return pArray;
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *pnAlloc = sqlite3DbMallocSize(db, pNew)/szEntry;
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pArray = pNew;
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = (char*)pArray;
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&z[*pnEntry * szEntry], 0, szEntry);
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *pIdx = *pnEntry;
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++*pnEntry;
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pArray;
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Append a new element to the given IdList.  Create a new IdList if
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** need be.
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A new IdList is returned, or NULL if malloc() fails.
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IdList *sqlite3IdListAppend(sqlite3 *db, IdList *pList, Token *pToken){
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList==0 ){
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pList = sqlite3DbMallocZero(db, sizeof(IdList) );
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pList==0 ) return 0;
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pList->nAlloc = 0;
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pList->a = sqlite3ArrayAllocate(
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db,
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pList->a,
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sizeof(pList->a[0]),
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      5,
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &pList->nId,
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &pList->nAlloc,
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &i
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( i<0 ){
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3IdListDelete(db, pList);
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pList->a[i].zName = sqlite3NameFromToken(db, pToken);
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pList;
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete an IdList.
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3IdListDelete(sqlite3 *db, IdList *pList){
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList==0 ) return;
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<pList->nId; i++){
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pList->a[i].zName);
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, pList->a);
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, pList);
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the index in pList of the identifier named zId.  Return -1
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if not found.
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3IdListIndex(IdList *pList, const char *zName){
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList==0 ) return -1;
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<pList->nId; i++){
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i;
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return -1;
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expand the space allocated for the given SrcList object by
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** creating nExtra new slots beginning at iStart.  iStart is zero based.
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** New slots are zeroed.
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For example, suppose a SrcList initially contains two entries: A,B.
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** To append 3 new entries onto the end, do this:
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    sqlite3SrcListEnlarge(db, pSrclist, 3, 2);
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** After the call above it would contain:  A, B, nil, nil, nil.
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the iStart argument had been 1 instead of 2, then the result
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** would have been:  A, nil, nil, nil, B.  To prepend the new slots,
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the iStart value would be 0.  The result then would
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be: nil, nil, nil, A, B.
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If a memory allocation fails the SrcList is unchanged.  The
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** db->mallocFailed flag will be set to true.
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SrcList *sqlite3SrcListEnlarge(
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db,       /* Database connection to notify of OOM errors */
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SrcList *pSrc,     /* The SrcList to be enlarged */
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nExtra,        /* Number of new slots to add to pSrc->a[] */
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iStart         /* Index in pSrc->a[] of first new slot */
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Sanity checking on calling parameters */
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iStart>=0 );
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( nExtra>=1 );
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pSrc!=0 );
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iStart<=pSrc->nSrc );
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Allocate additional space if needed */
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pSrc->nSrc+nExtra>pSrc->nAlloc ){
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SrcList *pNew;
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nAlloc = pSrc->nSrc+nExtra;
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nGot;
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pNew = sqlite3DbRealloc(db, pSrc,
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) );
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pNew==0 ){
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( db->mallocFailed );
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return pSrc;
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pSrc = pNew;
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1;
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pSrc->nAlloc = (u16)nGot;
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Move existing slots that come after the newly inserted slots
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** out of the way */
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=pSrc->nSrc-1; i>=iStart; i--){
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pSrc->a[i+nExtra] = pSrc->a[i];
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pSrc->nSrc += (i16)nExtra;
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Zero the newly allocated slots */
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&pSrc->a[iStart], 0, sizeof(pSrc->a[0])*nExtra);
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=iStart; i<iStart+nExtra; i++){
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pSrc->a[i].iCursor = -1;
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Return a pointer to the enlarged SrcList */
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pSrc;
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Append a new table name to the given SrcList.  Create a new SrcList if
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** need be.  A new entry is created in the SrcList even if pTable is NULL.
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A SrcList is returned, or NULL if there is an OOM error.  The returned
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SrcList might be the same as the SrcList that was input or it might be
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a new one.  If an OOM error does occurs, then the prior value of pList
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that is input to this routine is automatically freed.
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pDatabase is not null, it means that the table has an optional
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database name prefix.  Like this:  "database.table".  The pDatabase
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** points to the table name and the pTable points to the database name.
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The SrcList.a[].zName field is filled with the table name which might
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** come from pTable (if pDatabase is NULL) or from pDatabase.
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SrcList.a[].zDatabase is filled with the database name from pTable,
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or with NULL if no database is specified.
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** In other words, if call like this:
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**         sqlite3SrcListAppend(D,A,B,0);
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Then B is a table name and the database name is unspecified.  If called
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** like this:
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**         sqlite3SrcListAppend(D,A,B,C);
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Then C is the table name and B is the database name.  If C is defined
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then so is B.  In other words, we never have a case where:
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**         sqlite3SrcListAppend(D,A,0,C);
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Both pTable and pDatabase are assumed to be quoted.  They are dequoted
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** before being added to the SrcList.
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SrcList *sqlite3SrcListAppend(
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db,        /* Connection to notify of malloc failures */
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SrcList *pList,     /* Append to this SrcList. NULL creates a new SrcList */
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pTable,      /* Table to append */
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pDatabase    /* Database of the table */
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct SrcList_item *pItem;
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pDatabase==0 || pTable!=0 );  /* Cannot have C without B */
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList==0 ){
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pList = sqlite3DbMallocZero(db, sizeof(SrcList) );
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pList==0 ) return 0;
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pList->nAlloc = 1;
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc);
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed ){
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SrcListDelete(db, pList);
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pItem = &pList->a[pList->nSrc-1];
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pDatabase && pDatabase->z==0 ){
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pDatabase = 0;
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pDatabase ){
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Token *pTemp = pDatabase;
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pDatabase = pTable;
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pTable = pTemp;
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pItem->zName = sqlite3NameFromToken(db, pTable);
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pItem->zDatabase = sqlite3NameFromToken(db, pDatabase);
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pList;
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Assign VdbeCursor index numbers to all tables in a SrcList
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct SrcList_item *pItem;
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(pList || pParse->db->mallocFailed );
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList ){
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pItem->iCursor>=0 ) break;
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pItem->iCursor = pParse->nTab++;
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pItem->pSelect ){
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc);
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete an entire SrcList including all its substructure.
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct SrcList_item *pItem;
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pList==0 ) return;
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pItem=pList->a, i=0; i<pList->nSrc; i++, pItem++){
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pItem->zDatabase);
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pItem->zName);
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pItem->zAlias);
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pItem->zIndex);
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DeleteTable(db, pItem->pTab);
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SelectDelete(db, pItem->pSelect);
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExprDelete(db, pItem->pOn);
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3IdListDelete(db, pItem->pUsing);
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, pList);
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called by the parser to add a new term to the
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** end of a growing FROM clause.  The "p" parameter is the part of
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the FROM clause that has already been constructed.  "p" is NULL
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if this is the first term of the FROM clause.  pTable and pDatabase
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are the name of the table and database named in the FROM clause term.
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pDatabase is NULL if the database name qualifier is missing - the
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** usual case.  If the term has a alias, then pAlias points to the
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** alias token.  If the term is a subquery, then pSubquery is the
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT statement that the subquery encodes.  The pTable and
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pDatabase parameters are NULL for subqueries.  The pOn and pUsing
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parameters are the content of the ON and USING clauses.
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a new SrcList which encodes is the FROM with the new
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** term added.
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SrcList *sqlite3SrcListAppendFromTerm(
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pParse,          /* Parsing context */
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SrcList *p,             /* The left part of the FROM clause already seen */
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pTable,          /* Name of the table to add to the FROM clause */
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pDatabase,       /* Name of the database containing pTable */
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pAlias,          /* The right-hand side of the AS subexpression */
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Select *pSubquery,      /* A subquery used in place of a table name */
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Expr *pOn,              /* The ON clause of a join */
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IdList *pUsing          /* The USING clause of a join */
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct SrcList_item *pItem;
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !p && (pOn || pUsing) ){
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s",
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (pOn ? "ON" : "USING")
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    );
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto append_from_error;
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = sqlite3SrcListAppend(db, p, pTable, pDatabase);
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p==0 || NEVER(p->nSrc==0) ){
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto append_from_error;
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pItem = &p->a[p->nSrc-1];
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pAlias!=0 );
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pAlias->n ){
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pItem->zAlias = sqlite3NameFromToken(db, pAlias);
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pItem->pSelect = pSubquery;
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pItem->pOn = pOn;
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pItem->pUsing = pUsing;
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return p;
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) append_from_error:
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p==0 );
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ExprDelete(db, pOn);
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3IdListDelete(db, pUsing);
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3SelectDelete(db, pSubquery);
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add an INDEXED BY or NOT INDEXED clause to the most recently added
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** element of the source-list passed as the second argument.
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pIndexedBy!=0 );
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p && ALWAYS(p->nSrc>0) ){
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct SrcList_item *pItem = &p->a[p->nSrc-1];
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pItem->notIndexed==0 && pItem->zIndex==0 );
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pIndexedBy->n==1 && !pIndexedBy->z ){
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* A "NOT INDEXED" clause was supplied. See parse.y
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** construct "indexed_opt" for details. */
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pItem->notIndexed = 1;
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pItem->zIndex = sqlite3NameFromToken(pParse->db, pIndexedBy);
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** When building up a FROM clause in the parser, the join operator
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is initially attached to the left operand.  But the code generator
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expects the join operator to be on the right operand.  This routine
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Shifts all join operators from left to right for an entire FROM
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** clause.
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Example: Suppose the join is like this:
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**           A natural cross join B
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The operator is "natural cross join".  The A and B operands are stored
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in p->a[0] and p->a[1], respectively.  The parser initially stores the
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** operator with A.  This routine shifts that operator over to B.
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3SrcListShiftJoinType(SrcList *p){
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p && p->a ){
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=p->nSrc-1; i>0; i--){
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->a[i].jointype = p->a[i-1].jointype;
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->a[0].jointype = 0;
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Begin a transaction
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3BeginTransaction(Parse *pParse, int type){
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db;
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v;
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pParse!=0 );
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db = pParse->db;
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db!=0 );
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*  if( db->aDb[0].pBt==0 ) return; */
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ){
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v = sqlite3GetVdbe(pParse);
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !v ) return;
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( type!=TK_DEFERRED ){
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<db->nDb; i++){
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeAddOp2(v, OP_Transaction, i, (type==TK_EXCLUSIVE)+1);
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeUsesBtree(v, i);
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp2(v, OP_AutoCommit, 0, 0);
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Commit a transaction
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3CommitTransaction(Parse *pParse){
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db;
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v;
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pParse!=0 );
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db = pParse->db;
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db!=0 );
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*  if( db->aDb[0].pBt==0 ) return; */
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ){
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v = sqlite3GetVdbe(pParse);
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( v ){
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, 0);
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Rollback a transaction
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3RollbackTransaction(Parse *pParse){
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db;
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v;
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pParse!=0 );
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db = pParse->db;
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db!=0 );
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*  if( db->aDb[0].pBt==0 ) return; */
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ){
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v = sqlite3GetVdbe(pParse);
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( v ){
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, 1);
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is called by the parser when it parses a command to create,
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** release or rollback an SQL savepoint.
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3Savepoint(Parse *pParse, int op, Token *pName){
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zName = sqlite3NameFromToken(pParse->db, pName);
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zName ){
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vdbe *v = sqlite3GetVdbe(pParse);
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTHORIZATION
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const char * const az[] = { "BEGIN", "RELEASE", "ROLLBACK" };
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( !SAVEPOINT_BEGIN && SAVEPOINT_RELEASE==1 && SAVEPOINT_ROLLBACK==2 );
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !v || sqlite3AuthCheck(pParse, SQLITE_SAVEPOINT, az[op], zName, 0) ){
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(pParse->db, zName);
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeAddOp4(v, OP_Savepoint, op, 0, 0, zName, P4_DYNAMIC);
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Make sure the TEMP database is open and available for use.  Return
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the number of errors.  Leave any error messages in the pParse structure.
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3OpenTempDatabase(Parse *pParse){
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->aDb[1].pBt==0 && !pParse->explain ){
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rc;
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Btree *pBt;
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const int flags =
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SQLITE_OPEN_READWRITE |
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SQLITE_OPEN_CREATE |
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SQLITE_OPEN_EXCLUSIVE |
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SQLITE_OPEN_DELETEONCLOSE |
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SQLITE_OPEN_TEMP_DB;
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeOpen(0, db, &pBt, 0, flags);
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc!=SQLITE_OK ){
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ErrorMsg(pParse, "unable to open a temporary database "
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "file for storing temporary tables");
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pParse->rc = rc;
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->aDb[1].pBt = pBt;
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( db->aDb[1].pSchema );
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->mallocFailed = 1;
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate VDBE code that will verify the schema cookie and start
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a read-transaction for all named database files.
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It is important that all schema cookies be verified and all
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** read transactions be started before anything else happens in
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the VDBE program.  But this routine can be called after much other
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** code has been generated.  So here is what we do:
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The first time this routine is called, we code an OP_Goto that
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will jump to a subroutine at the end of the program.  Then we
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** record every database that needs its schema verified in the
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pParse->cookieMask field.  Later, after all other code has been
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** generated, the subroutine that does the cookie verifications and
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** starts the transactions will be coded and the OP_Goto P2 value
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will be made to point to that subroutine.  The generation of the
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cookie verification subroutine code happens in sqlite3FinishCoding().
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If iDb<0 then code the OP_Goto only - don't set flag to verify the
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** schema on any databases.  This can be used to position the OP_Goto
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** early in the code, before we know if any database tables will be used.
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pToplevel = sqlite3ParseToplevel(pParse);
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pToplevel->cookieGoto==0 ){
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vdbe *v = sqlite3GetVdbe(pToplevel);
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( v==0 ) return;  /* This only happens if there was a prior error */
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pToplevel->cookieGoto = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0)+1;
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iDb>=0 ){
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3 *db = pToplevel->db;
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    yDbMask mask;
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( iDb<db->nDb );
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( db->aDb[iDb].pBt!=0 || iDb==1 );
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( iDb<SQLITE_MAX_ATTACHED+2 );
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mask = ((yDbMask)1)<<iDb;
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (pToplevel->cookieMask & mask)==0 ){
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pToplevel->cookieMask |= mask;
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pToplevel->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie;
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( !OMIT_TEMPDB && iDb==1 ){
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3OpenTempDatabase(pToplevel);
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If argument zDb is NULL, then call sqlite3CodeVerifySchema() for each
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** attached database. Otherwise, invoke it for the database named zDb only.
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3CodeVerifyNamedSchema(Parse *pParse, const char *zDb){
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<db->nDb; i++){
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Db *pDb = &db->aDb[i];
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pDb->pBt && (!zDb || 0==sqlite3StrICmp(zDb, pDb->zName)) ){
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3CodeVerifySchema(pParse, i);
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate VDBE code that prepares for doing an operation that
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** might change the database.
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine starts a new transaction if we are not already within
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a transaction.  If we are already within a transaction, then a checkpoint
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is set if the setStatement parameter is true.  A checkpoint should
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be set for operations that might fail (due to a constraint) part of
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the way through and which will need to undo some writes without having to
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** rollback the whole transaction.  For operations where all constraints
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can be checked before any changes are made to the database, it is never
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** necessary to undo a write and the checkpoint should not be set.
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pToplevel = sqlite3ParseToplevel(pParse);
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3CodeVerifySchema(pParse, iDb);
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pToplevel->writeMask |= ((yDbMask)1)<<iDb;
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pToplevel->isMultiWrite |= setStatement;
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Indicate that the statement currently under construction might write
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** more than one entry (example: deleting one row then inserting another,
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** inserting multiple rows in a table, or inserting a row and index entries.)
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If an abort occurs after some of these writes have completed, then it will
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be necessary to undo the completed writes.
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3MultiWrite(Parse *pParse){
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pToplevel = sqlite3ParseToplevel(pParse);
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pToplevel->isMultiWrite = 1;
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The code generator calls this routine if is discovers that it is
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** possible to abort a statement prior to completion.  In order to
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** perform this abort without corrupting the database, we need to make
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sure that the statement is protected by a statement transaction.
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Technically, we only need to set the mayAbort flag if the
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** isMultiWrite flag was previously set.  There is a time dependency
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** such that the abort must occur after the multiwrite.  This makes
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** some statements involving the REPLACE conflict resolution algorithm
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** go a little faster.  But taking advantage of this time dependency
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** makes it more difficult to prove that the code is correct (in
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** particular, it prevents us from writing an effective
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** implementation of sqlite3AssertMayAbort()) and so we have chosen
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to take the safe route and skip the optimization.
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3MayAbort(Parse *pParse){
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Parse *pToplevel = sqlite3ParseToplevel(pParse);
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pToplevel->mayAbort = 1;
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Code an OP_Halt that causes the vdbe to return an SQLITE_CONSTRAINT
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** error. The onError parameter determines which (if any) of the statement
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and/or current transaction is rolled back.
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3HaltConstraint(Parse *pParse, int onError, char *p4, int p4type){
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v = sqlite3GetVdbe(pParse);
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( onError==OE_Abort ){
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3MayAbort(pParse);
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CONSTRAINT, onError, 0, p4, p4type);
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check to see if pIndex uses the collating sequence pColl.  Return
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** true if it does and false if it does not.
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_REINDEX
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int collationMatch(const char *zColl, Index *pIndex){
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zColl!=0 );
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<pIndex->nColumn; i++){
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *z = pIndex->azColl[i];
36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( z!=0 );
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( 0==sqlite3StrICmp(z, zColl) ){
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 1;
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Recompute all indices of pTab that use the collating sequence pColl.
36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pColl==0 then recompute all indices of pTab.
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_REINDEX
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Index *pIndex;              /* An index associated with pTab */
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zColl==0 || collationMatch(zColl, pIndex) ){
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3BeginWriteOperation(pParse, 0, iDb);
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3RefillIndex(pParse, pIndex, -1);
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Recompute all indices of all tables in all databases where the
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** indices use the collating sequence pColl.  If pColl==0 then recompute
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** all indices everywhere.
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_REINDEX
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void reindexDatabases(Parse *pParse, char const *zColl){
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Db *pDb;                    /* A single database */
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;                    /* The database index number */
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;   /* The database connection */
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HashElem *k;                /* For looping over tables in pDb */
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTab;                /* A table in the database */
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3BtreeHoldsAllMutexes(db) );  /* Needed for schema access */
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(iDb=0, pDb=db->aDb; iDb<db->nDb; iDb++, pDb++){
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pDb!=0 );
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(k=sqliteHashFirst(&pDb->pSchema->tblHash);  k; k=sqliteHashNext(k)){
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pTab = (Table*)sqliteHashData(k);
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reindexTable(pParse, pTab, zColl);
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for the REINDEX command.
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**        REINDEX                            -- 1
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**        REINDEX  <collation>               -- 2
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**        REINDEX  ?<database>.?<tablename>  -- 3
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**        REINDEX  ?<database>.?<indexname>  -- 4
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Form 1 causes all indices in all attached databases to be rebuilt.
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Form 2 rebuilds all indices in all databases that use the named
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** collating function.  Forms 3 and 4 rebuild the named index or all
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** indices associated with the named table.
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_REINDEX
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CollSeq *pColl;             /* Collating sequence to be reindexed, or NULL */
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;                    /* Name of a table or index */
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zDb;            /* Name of the database */
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Table *pTab;                /* A table in the database */
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Index *pIndex;              /* An index associated with pTab */
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;                    /* The database index number */
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;   /* The database connection */
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Token *pObjName;            /* Name of the table or index to be reindexed */
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Read the database schema. If an error occurs, leave an error message
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** and code in pParse and return NULL. */
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pName1==0 ){
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reindexDatabases(pParse, 0);
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( NEVER(pName2==0) || pName2->z==0 ){
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *zColl;
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pName1->z );
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zColl = sqlite3NameFromToken(pParse->db, pName1);
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !zColl ) return;
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0);
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pColl ){
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reindexDatabases(pParse, zColl);
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, zColl);
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, zColl);
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName);
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iDb<0 ) return;
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = sqlite3NameFromToken(db, pObjName);
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( z==0 ) return;
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zDb = db->aDb[iDb].zName;
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pTab = sqlite3FindTable(db, z, zDb);
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pTab ){
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reindexTable(pParse, pTab, 0);
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, z);
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIndex = sqlite3FindIndex(db, z, zDb);
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, z);
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIndex ){
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3BeginWriteOperation(pParse, 0, iDb);
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3RefillIndex(pParse, pIndex, -1);
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3ErrorMsg(pParse, "unable to identify the object to be reindexed");
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a dynamicly allocated KeyInfo structure that can be used
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with OP_OpenRead or OP_OpenWrite to access database index pIdx.
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If successful, a pointer to the new structure is returned. In this case
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the caller is responsible for calling sqlite3DbFree(db, ) on the returned
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pointer. If an error occurs (out of memory or missing collation
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sequence), NULL is returned and the state of pParse updated to reflect
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the error.
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyInfo *sqlite3IndexKeyinfo(Parse *pParse, Index *pIdx){
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nCol = pIdx->nColumn;
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nBytes = sizeof(KeyInfo) + (nCol-1)*sizeof(CollSeq*) + nCol;
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = pParse->db;
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeyInfo *pKey = (KeyInfo *)sqlite3DbMallocZero(db, nBytes);
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pKey ){
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pKey->db = pParse->db;
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pKey->aSortOrder = (u8 *)&(pKey->aColl[nCol]);
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( &pKey->aSortOrder[nCol]==&(((u8 *)pKey)[nBytes]) );
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<nCol; i++){
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char *zColl = pIdx->azColl[i];
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( zColl );
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pKey->aColl[i] = sqlite3LocateCollSeq(pParse, zColl);
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pKey->aSortOrder[i] = pIdx->aSortOrder[i];
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pKey->nField = (u16)nCol;
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pParse->nErr ){
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, pKey);
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pKey = 0;
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pKey;
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3758