extensions/sqlite/sqlite-source/build.c
author David Anderson <dvander@alliedmods.net>
Fri Jul 11 06:51:21 2008 +0000 (2008-07-11)
branchrefac-jit
changeset 2192 7602d7fb60d9
parent 2168 c24a6fa957db
permissions -rw-r--r--
fixed a compat regression, forgot msvc does funky things with overloaded virtual calls
dvander@2168
     1
/*
dvander@2168
     2
** 2001 September 15
dvander@2168
     3
**
dvander@2168
     4
** The author disclaims copyright to this source code.  In place of
dvander@2168
     5
** a legal notice, here is a blessing:
dvander@2168
     6
**
dvander@2168
     7
**    May you do good and not evil.
dvander@2168
     8
**    May you find forgiveness for yourself and forgive others.
dvander@2168
     9
**    May you share freely, never taking more than you give.
dvander@2168
    10
**
dvander@2168
    11
*************************************************************************
dvander@2168
    12
** This file contains C code routines that are called by the SQLite parser
dvander@2168
    13
** when syntax rules are reduced.  The routines in this file handle the
dvander@2168
    14
** following kinds of SQL syntax:
dvander@2168
    15
**
dvander@2168
    16
**     CREATE TABLE
dvander@2168
    17
**     DROP TABLE
dvander@2168
    18
**     CREATE INDEX
dvander@2168
    19
**     DROP INDEX
dvander@2168
    20
**     creating ID lists
dvander@2168
    21
**     BEGIN TRANSACTION
dvander@2168
    22
**     COMMIT
dvander@2168
    23
**     ROLLBACK
dvander@2168
    24
**
dvander@2168
    25
** $Id$
dvander@2168
    26
*/
dvander@2168
    27
#include "sqliteInt.h"
dvander@2168
    28
#include <ctype.h>
dvander@2168
    29
dvander@2168
    30
/*
dvander@2168
    31
** This routine is called when a new SQL statement is beginning to
dvander@2168
    32
** be parsed.  Initialize the pParse structure as needed.
dvander@2168
    33
*/
dvander@2168
    34
void sqlite3BeginParse(Parse *pParse, int explainFlag){
dvander@2168
    35
  pParse->explain = explainFlag;
dvander@2168
    36
  pParse->nVar = 0;
dvander@2168
    37
}
dvander@2168
    38
dvander@2168
    39
#ifndef SQLITE_OMIT_SHARED_CACHE
dvander@2168
    40
/*
dvander@2168
    41
** The TableLock structure is only used by the sqlite3TableLock() and
dvander@2168
    42
** codeTableLocks() functions.
dvander@2168
    43
*/
dvander@2168
    44
struct TableLock {
dvander@2168
    45
  int iDb;             /* The database containing the table to be locked */
dvander@2168
    46
  int iTab;            /* The root page of the table to be locked */
dvander@2168
    47
  u8 isWriteLock;      /* True for write lock.  False for a read lock */
dvander@2168
    48
  const char *zName;   /* Name of the table */
dvander@2168
    49
};
dvander@2168
    50
dvander@2168
    51
/*
dvander@2168
    52
** Record the fact that we want to lock a table at run-time.  
dvander@2168
    53
**
dvander@2168
    54
** The table to be locked has root page iTab and is found in database iDb.
dvander@2168
    55
** A read or a write lock can be taken depending on isWritelock.
dvander@2168
    56
**
dvander@2168
    57
** This routine just records the fact that the lock is desired.  The
dvander@2168
    58
** code to make the lock occur is generated by a later call to
dvander@2168
    59
** codeTableLocks() which occurs during sqlite3FinishCoding().
dvander@2168
    60
*/
dvander@2168
    61
void sqlite3TableLock(
dvander@2168
    62
  Parse *pParse,     /* Parsing context */
dvander@2168
    63
  int iDb,           /* Index of the database containing the table to lock */
dvander@2168
    64
  int iTab,          /* Root page number of the table to be locked */
dvander@2168
    65
  u8 isWriteLock,    /* True for a write lock */
dvander@2168
    66
  const char *zName  /* Name of the table to be locked */
dvander@2168
    67
){
dvander@2168
    68
  int i;
dvander@2168
    69
  int nBytes;
dvander@2168
    70
  TableLock *p;
dvander@2168
    71
dvander@2168
    72
  if( iDb<0 ){
dvander@2168
    73
    return;
dvander@2168
    74
  }
dvander@2168
    75
dvander@2168
    76
  for(i=0; i<pParse->nTableLock; i++){
dvander@2168
    77
    p = &pParse->aTableLock[i];
dvander@2168
    78
    if( p->iDb==iDb && p->iTab==iTab ){
dvander@2168
    79
      p->isWriteLock = (p->isWriteLock || isWriteLock);
dvander@2168
    80
      return;
dvander@2168
    81
    }
dvander@2168
    82
  }
dvander@2168
    83
dvander@2168
    84
  nBytes = sizeof(TableLock) * (pParse->nTableLock+1);
dvander@2168
    85
  pParse->aTableLock = 
dvander@2168
    86
      sqlite3DbReallocOrFree(pParse->db, pParse->aTableLock, nBytes);
dvander@2168
    87
  if( pParse->aTableLock ){
dvander@2168
    88
    p = &pParse->aTableLock[pParse->nTableLock++];
dvander@2168
    89
    p->iDb = iDb;
dvander@2168
    90
    p->iTab = iTab;
dvander@2168
    91
    p->isWriteLock = isWriteLock;
dvander@2168
    92
    p->zName = zName;
dvander@2168
    93
  }else{
dvander@2168
    94
    pParse->nTableLock = 0;
dvander@2168
    95
    pParse->db->mallocFailed = 1;
dvander@2168
    96
  }
dvander@2168
    97
}
dvander@2168
    98
dvander@2168
    99
/*
dvander@2168
   100
** Code an OP_TableLock instruction for each table locked by the
dvander@2168
   101
** statement (configured by calls to sqlite3TableLock()).
dvander@2168
   102
*/
dvander@2168
   103
static void codeTableLocks(Parse *pParse){
dvander@2168
   104
  int i;
dvander@2168
   105
  Vdbe *pVdbe; 
dvander@2168
   106
dvander@2168
   107
  if( 0==(pVdbe = sqlite3GetVdbe(pParse)) ){
dvander@2168
   108
    return;
dvander@2168
   109
  }
dvander@2168
   110
dvander@2168
   111
  for(i=0; i<pParse->nTableLock; i++){
dvander@2168
   112
    TableLock *p = &pParse->aTableLock[i];
dvander@2168
   113
    int p1 = p->iDb;
dvander@2168
   114
    if( p->isWriteLock ){
dvander@2168
   115
      p1 = -1*(p1+1);
dvander@2168
   116
    }
dvander@2168
   117
    sqlite3VdbeOp3(pVdbe, OP_TableLock, p1, p->iTab, p->zName, P3_STATIC);
dvander@2168
   118
  }
dvander@2168
   119
}
dvander@2168
   120
#else
dvander@2168
   121
  #define codeTableLocks(x)
dvander@2168
   122
#endif
dvander@2168
   123
dvander@2168
   124
/*
dvander@2168
   125
** This routine is called after a single SQL statement has been
dvander@2168
   126
** parsed and a VDBE program to execute that statement has been
dvander@2168
   127
** prepared.  This routine puts the finishing touches on the
dvander@2168
   128
** VDBE program and resets the pParse structure for the next
dvander@2168
   129
** parse.
dvander@2168
   130
**
dvander@2168
   131
** Note that if an error occurred, it might be the case that
dvander@2168
   132
** no VDBE code was generated.
dvander@2168
   133
*/
dvander@2168
   134
void sqlite3FinishCoding(Parse *pParse){
dvander@2168
   135
  sqlite3 *db;
dvander@2168
   136
  Vdbe *v;
dvander@2168
   137
dvander@2168
   138
  db = pParse->db;
dvander@2168
   139
  if( db->mallocFailed ) return;
dvander@2168
   140
  if( pParse->nested ) return;
dvander@2168
   141
  if( !pParse->pVdbe ){
dvander@2168
   142
    if( pParse->rc==SQLITE_OK && pParse->nErr ){
dvander@2168
   143
      pParse->rc = SQLITE_ERROR;
dvander@2168
   144
      return;
dvander@2168
   145
    }
dvander@2168
   146
  }
dvander@2168
   147
dvander@2168
   148
  /* Begin by generating some termination code at the end of the
dvander@2168
   149
  ** vdbe program
dvander@2168
   150
  */
dvander@2168
   151
  v = sqlite3GetVdbe(pParse);
dvander@2168
   152
  if( v ){
dvander@2168
   153
    sqlite3VdbeAddOp(v, OP_Halt, 0, 0);
dvander@2168
   154
dvander@2168
   155
    /* The cookie mask contains one bit for each database file open.
dvander@2168
   156
    ** (Bit 0 is for main, bit 1 is for temp, and so forth.)  Bits are
dvander@2168
   157
    ** set for each database that is used.  Generate code to start a
dvander@2168
   158
    ** transaction on each used database and to verify the schema cookie
dvander@2168
   159
    ** on each used database.
dvander@2168
   160
    */
dvander@2168
   161
    if( pParse->cookieGoto>0 ){
dvander@2168
   162
      u32 mask;
dvander@2168
   163
      int iDb;
dvander@2168
   164
      sqlite3VdbeJumpHere(v, pParse->cookieGoto-1);
dvander@2168
   165
      for(iDb=0, mask=1; iDb<db->nDb; mask<<=1, iDb++){
dvander@2168
   166
        if( (mask & pParse->cookieMask)==0 ) continue;
dvander@2168
   167
        sqlite3VdbeUsesBtree(v, iDb);
dvander@2168
   168
        sqlite3VdbeAddOp(v, OP_Transaction, iDb, (mask & pParse->writeMask)!=0);
dvander@2168
   169
        sqlite3VdbeAddOp(v, OP_VerifyCookie, iDb, pParse->cookieValue[iDb]);
dvander@2168
   170
      }
dvander@2168
   171
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@2168
   172
      if( pParse->pVirtualLock ){
dvander@2168
   173
        char *vtab = (char *)pParse->pVirtualLock->pVtab;
dvander@2168
   174
        sqlite3VdbeOp3(v, OP_VBegin, 0, 0, vtab, P3_VTAB);
dvander@2168
   175
      }
dvander@2168
   176
#endif
dvander@2168
   177
dvander@2168
   178
      /* Once all the cookies have been verified and transactions opened, 
dvander@2168
   179
      ** obtain the required table-locks. This is a no-op unless the 
dvander@2168
   180
      ** shared-cache feature is enabled.
dvander@2168
   181
      */
dvander@2168
   182
      codeTableLocks(pParse);
dvander@2168
   183
      sqlite3VdbeAddOp(v, OP_Goto, 0, pParse->cookieGoto);
dvander@2168
   184
    }
dvander@2168
   185
dvander@2168
   186
#ifndef SQLITE_OMIT_TRACE
dvander@2168
   187
    /* Add a No-op that contains the complete text of the compiled SQL
dvander@2168
   188
    ** statement as its P3 argument.  This does not change the functionality
dvander@2168
   189
    ** of the program. 
dvander@2168
   190
    **
dvander@2168
   191
    ** This is used to implement sqlite3_trace().
dvander@2168
   192
    */
dvander@2168
   193
    sqlite3VdbeOp3(v, OP_Noop, 0, 0, pParse->zSql, pParse->zTail-pParse->zSql);
dvander@2168
   194
#endif /* SQLITE_OMIT_TRACE */
dvander@2168
   195
  }
dvander@2168
   196
dvander@2168
   197
dvander@2168
   198
  /* Get the VDBE program ready for execution
dvander@2168
   199
  */
dvander@2168
   200
  if( v && pParse->nErr==0 && !db->mallocFailed ){
dvander@2168
   201
#ifdef SQLITE_DEBUG
dvander@2168
   202
    FILE *trace = (db->flags & SQLITE_VdbeTrace)!=0 ? stdout : 0;
dvander@2168
   203
    sqlite3VdbeTrace(v, trace);
dvander@2168
   204
#endif
dvander@2168
   205
    sqlite3VdbeMakeReady(v, pParse->nVar, pParse->nMem+3,
dvander@2168
   206
                         pParse->nTab+3, pParse->explain);
dvander@2168
   207
    pParse->rc = SQLITE_DONE;
dvander@2168
   208
    pParse->colNamesSet = 0;
dvander@2168
   209
  }else if( pParse->rc==SQLITE_OK ){
dvander@2168
   210
    pParse->rc = SQLITE_ERROR;
dvander@2168
   211
  }
dvander@2168
   212
  pParse->nTab = 0;
dvander@2168
   213
  pParse->nMem = 0;
dvander@2168
   214
  pParse->nSet = 0;
dvander@2168
   215
  pParse->nVar = 0;
dvander@2168
   216
  pParse->cookieMask = 0;
dvander@2168
   217
  pParse->cookieGoto = 0;
dvander@2168
   218
}
dvander@2168
   219
dvander@2168
   220
/*
dvander@2168
   221
** Run the parser and code generator recursively in order to generate
dvander@2168
   222
** code for the SQL statement given onto the end of the pParse context
dvander@2168
   223
** currently under construction.  When the parser is run recursively
dvander@2168
   224
** this way, the final OP_Halt is not appended and other initialization
dvander@2168
   225
** and finalization steps are omitted because those are handling by the
dvander@2168
   226
** outermost parser.
dvander@2168
   227
**
dvander@2168
   228
** Not everything is nestable.  This facility is designed to permit
dvander@2168
   229
** INSERT, UPDATE, and DELETE operations against SQLITE_MASTER.  Use
dvander@2168
   230
** care if you decide to try to use this routine for some other purposes.
dvander@2168
   231
*/
dvander@2168
   232
void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){
dvander@2168
   233
  va_list ap;
dvander@2168
   234
  char *zSql;
dvander@2168
   235
# define SAVE_SZ  (sizeof(Parse) - offsetof(Parse,nVar))
dvander@2168
   236
  char saveBuf[SAVE_SZ];
dvander@2168
   237
dvander@2168
   238
  if( pParse->nErr ) return;
dvander@2168
   239
  assert( pParse->nested<10 );  /* Nesting should only be of limited depth */
dvander@2168
   240
  va_start(ap, zFormat);
dvander@2168
   241
  zSql = sqlite3VMPrintf(pParse->db, zFormat, ap);
dvander@2168
   242
  va_end(ap);
dvander@2168
   243
  if( zSql==0 ){
dvander@2168
   244
    pParse->db->mallocFailed = 1;
dvander@2168
   245
    return;   /* A malloc must have failed */
dvander@2168
   246
  }
dvander@2168
   247
  pParse->nested++;
dvander@2168
   248
  memcpy(saveBuf, &pParse->nVar, SAVE_SZ);
dvander@2168
   249
  memset(&pParse->nVar, 0, SAVE_SZ);
dvander@2168
   250
  sqlite3RunParser(pParse, zSql, 0);
dvander@2168
   251
  sqlite3_free(zSql);
dvander@2168
   252
  memcpy(&pParse->nVar, saveBuf, SAVE_SZ);
dvander@2168
   253
  pParse->nested--;
dvander@2168
   254
}
dvander@2168
   255
dvander@2168
   256
/*
dvander@2168
   257
** Locate the in-memory structure that describes a particular database
dvander@2168
   258
** table given the name of that table and (optionally) the name of the
dvander@2168
   259
** database containing the table.  Return NULL if not found.
dvander@2168
   260
**
dvander@2168
   261
** If zDatabase is 0, all databases are searched for the table and the
dvander@2168
   262
** first matching table is returned.  (No checking for duplicate table
dvander@2168
   263
** names is done.)  The search order is TEMP first, then MAIN, then any
dvander@2168
   264
** auxiliary databases added using the ATTACH command.
dvander@2168
   265
**
dvander@2168
   266
** See also sqlite3LocateTable().
dvander@2168
   267
*/
dvander@2168
   268
Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){
dvander@2168
   269
  Table *p = 0;
dvander@2168
   270
  int i;
dvander@2168
   271
  assert( zName!=0 );
dvander@2168
   272
  for(i=OMIT_TEMPDB; i<db->nDb; i++){
dvander@2168
   273
    int j = (i<2) ? i^1 : i;   /* Search TEMP before MAIN */
dvander@2168
   274
    if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue;
dvander@2168
   275
    p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName, strlen(zName)+1);
dvander@2168
   276
    if( p ) break;
dvander@2168
   277
  }
dvander@2168
   278
  return p;
dvander@2168
   279
}
dvander@2168
   280
dvander@2168
   281
/*
dvander@2168
   282
** Locate the in-memory structure that describes a particular database
dvander@2168
   283
** table given the name of that table and (optionally) the name of the
dvander@2168
   284
** database containing the table.  Return NULL if not found.  Also leave an
dvander@2168
   285
** error message in pParse->zErrMsg.
dvander@2168
   286
**
dvander@2168
   287
** The difference between this routine and sqlite3FindTable() is that this
dvander@2168
   288
** routine leaves an error message in pParse->zErrMsg where
dvander@2168
   289
** sqlite3FindTable() does not.
dvander@2168
   290
*/
dvander@2168
   291
Table *sqlite3LocateTable(Parse *pParse, const char *zName, const char *zDbase){
dvander@2168
   292
  Table *p;
dvander@2168
   293
dvander@2168
   294
  /* Read the database schema. If an error occurs, leave an error message
dvander@2168
   295
  ** and code in pParse and return NULL. */
dvander@2168
   296
  if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
dvander@2168
   297
    return 0;
dvander@2168
   298
  }
dvander@2168
   299
dvander@2168
   300
  p = sqlite3FindTable(pParse->db, zName, zDbase);
dvander@2168
   301
  if( p==0 ){
dvander@2168
   302
    if( zDbase ){
dvander@2168
   303
      sqlite3ErrorMsg(pParse, "no such table: %s.%s", zDbase, zName);
dvander@2168
   304
    }else{
dvander@2168
   305
      sqlite3ErrorMsg(pParse, "no such table: %s", zName);
dvander@2168
   306
    }
dvander@2168
   307
    pParse->checkSchema = 1;
dvander@2168
   308
  }
dvander@2168
   309
  return p;
dvander@2168
   310
}
dvander@2168
   311
dvander@2168
   312
/*
dvander@2168
   313
** Locate the in-memory structure that describes 
dvander@2168
   314
** a particular index given the name of that index
dvander@2168
   315
** and the name of the database that contains the index.
dvander@2168
   316
** Return NULL if not found.
dvander@2168
   317
**
dvander@2168
   318
** If zDatabase is 0, all databases are searched for the
dvander@2168
   319
** table and the first matching index is returned.  (No checking
dvander@2168
   320
** for duplicate index names is done.)  The search order is
dvander@2168
   321
** TEMP first, then MAIN, then any auxiliary databases added
dvander@2168
   322
** using the ATTACH command.
dvander@2168
   323
*/
dvander@2168
   324
Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){
dvander@2168
   325
  Index *p = 0;
dvander@2168
   326
  int i;
dvander@2168
   327
  for(i=OMIT_TEMPDB; i<db->nDb; i++){
dvander@2168
   328
    int j = (i<2) ? i^1 : i;  /* Search TEMP before MAIN */
dvander@2168
   329
    Schema *pSchema = db->aDb[j].pSchema;
dvander@2168
   330
    if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zName) ) continue;
dvander@2168
   331
    assert( pSchema || (j==1 && !db->aDb[1].pBt) );
dvander@2168
   332
    if( pSchema ){
dvander@2168
   333
      p = sqlite3HashFind(&pSchema->idxHash, zName, strlen(zName)+1);
dvander@2168
   334
    }
dvander@2168
   335
    if( p ) break;
dvander@2168
   336
  }
dvander@2168
   337
  return p;
dvander@2168
   338
}
dvander@2168
   339
dvander@2168
   340
/*
dvander@2168
   341
** Reclaim the memory used by an index
dvander@2168
   342
*/
dvander@2168
   343
static void freeIndex(Index *p){
dvander@2168
   344
  sqlite3_free(p->zColAff);
dvander@2168
   345
  sqlite3_free(p);
dvander@2168
   346
}
dvander@2168
   347
dvander@2168
   348
/*
dvander@2168
   349
** Remove the given index from the index hash table, and free
dvander@2168
   350
** its memory structures.
dvander@2168
   351
**
dvander@2168
   352
** The index is removed from the database hash tables but
dvander@2168
   353
** it is not unlinked from the Table that it indexes.
dvander@2168
   354
** Unlinking from the Table must be done by the calling function.
dvander@2168
   355
*/
dvander@2168
   356
static void sqliteDeleteIndex(Index *p){
dvander@2168
   357
  Index *pOld;
dvander@2168
   358
  const char *zName = p->zName;
dvander@2168
   359
dvander@2168
   360
  pOld = sqlite3HashInsert(&p->pSchema->idxHash, zName, strlen( zName)+1, 0);
dvander@2168
   361
  assert( pOld==0 || pOld==p );
dvander@2168
   362
  freeIndex(p);
dvander@2168
   363
}
dvander@2168
   364
dvander@2168
   365
/*
dvander@2168
   366
** For the index called zIdxName which is found in the database iDb,
dvander@2168
   367
** unlike that index from its Table then remove the index from
dvander@2168
   368
** the index hash table and free all memory structures associated
dvander@2168
   369
** with the index.
dvander@2168
   370
*/
dvander@2168
   371
void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){
dvander@2168
   372
  Index *pIndex;
dvander@2168
   373
  int len;
dvander@2168
   374
  Hash *pHash = &db->aDb[iDb].pSchema->idxHash;
dvander@2168
   375
dvander@2168
   376
  len = strlen(zIdxName);
dvander@2168
   377
  pIndex = sqlite3HashInsert(pHash, zIdxName, len+1, 0);
dvander@2168
   378
  if( pIndex ){
dvander@2168
   379
    if( pIndex->pTable->pIndex==pIndex ){
dvander@2168
   380
      pIndex->pTable->pIndex = pIndex->pNext;
dvander@2168
   381
    }else{
dvander@2168
   382
      Index *p;
dvander@2168
   383
      for(p=pIndex->pTable->pIndex; p && p->pNext!=pIndex; p=p->pNext){}
dvander@2168
   384
      if( p && p->pNext==pIndex ){
dvander@2168
   385
        p->pNext = pIndex->pNext;
dvander@2168
   386
      }
dvander@2168
   387
    }
dvander@2168
   388
    freeIndex(pIndex);
dvander@2168
   389
  }
dvander@2168
   390
  db->flags |= SQLITE_InternChanges;
dvander@2168
   391
}
dvander@2168
   392
dvander@2168
   393
/*
dvander@2168
   394
** Erase all schema information from the in-memory hash tables of
dvander@2168
   395
** a single database.  This routine is called to reclaim memory
dvander@2168
   396
** before the database closes.  It is also called during a rollback
dvander@2168
   397
** if there were schema changes during the transaction or if a
dvander@2168
   398
** schema-cookie mismatch occurs.
dvander@2168
   399
**
dvander@2168
   400
** If iDb<=0 then reset the internal schema tables for all database
dvander@2168
   401
** files.  If iDb>=2 then reset the internal schema for only the
dvander@2168
   402
** single file indicated.
dvander@2168
   403
*/
dvander@2168
   404
void sqlite3ResetInternalSchema(sqlite3 *db, int iDb){
dvander@2168
   405
  int i, j;
dvander@2168
   406
dvander@2168
   407
  assert( iDb>=0 && iDb<db->nDb );
dvander@2168
   408
  for(i=iDb; i<db->nDb; i++){
dvander@2168
   409
    Db *pDb = &db->aDb[i];
dvander@2168
   410
    if( pDb->pSchema ){
dvander@2168
   411
      sqlite3SchemaFree(pDb->pSchema);
dvander@2168
   412
    }
dvander@2168
   413
    if( iDb>0 ) return;
dvander@2168
   414
  }
dvander@2168
   415
  assert( iDb==0 );
dvander@2168
   416
  db->flags &= ~SQLITE_InternChanges;
dvander@2168
   417
dvander@2168
   418
  /* If one or more of the auxiliary database files has been closed,
dvander@2168
   419
  ** then remove them from the auxiliary database list.  We take the
dvander@2168
   420
  ** opportunity to do this here since we have just deleted all of the
dvander@2168
   421
  ** schema hash tables and therefore do not have to make any changes
dvander@2168
   422
  ** to any of those tables.
dvander@2168
   423
  */
dvander@2168
   424
  for(i=0; i<db->nDb; i++){
dvander@2168
   425
    struct Db *pDb = &db->aDb[i];
dvander@2168
   426
    if( pDb->pBt==0 ){
dvander@2168
   427
      if( pDb->pAux && pDb->xFreeAux ) pDb->xFreeAux(pDb->pAux);
dvander@2168
   428
      pDb->pAux = 0;
dvander@2168
   429
    }
dvander@2168
   430
  }
dvander@2168
   431
  for(i=j=2; i<db->nDb; i++){
dvander@2168
   432
    struct Db *pDb = &db->aDb[i];
dvander@2168
   433
    if( pDb->pBt==0 ){
dvander@2168
   434
      sqlite3_free(pDb->zName);
dvander@2168
   435
      pDb->zName = 0;
dvander@2168
   436
      continue;
dvander@2168
   437
    }
dvander@2168
   438
    if( j<i ){
dvander@2168
   439
      db->aDb[j] = db->aDb[i];
dvander@2168
   440
    }
dvander@2168
   441
    j++;
dvander@2168
   442
  }
dvander@2168
   443
  memset(&db->aDb[j], 0, (db->nDb-j)*sizeof(db->aDb[j]));
dvander@2168
   444
  db->nDb = j;
dvander@2168
   445
  if( db->nDb<=2 && db->aDb!=db->aDbStatic ){
dvander@2168
   446
    memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0]));
dvander@2168
   447
    sqlite3_free(db->aDb);
dvander@2168
   448
    db->aDb = db->aDbStatic;
dvander@2168
   449
  }
dvander@2168
   450
}
dvander@2168
   451
dvander@2168
   452
/*
dvander@2168
   453
** This routine is called when a commit occurs.
dvander@2168
   454
*/
dvander@2168
   455
void sqlite3CommitInternalChanges(sqlite3 *db){
dvander@2168
   456
  db->flags &= ~SQLITE_InternChanges;
dvander@2168
   457
}
dvander@2168
   458
dvander@2168
   459
/*
dvander@2168
   460
** Clear the column names from a table or view.
dvander@2168
   461
*/
dvander@2168
   462
static void sqliteResetColumnNames(Table *pTable){
dvander@2168
   463
  int i;
dvander@2168
   464
  Column *pCol;
dvander@2168
   465
  assert( pTable!=0 );
dvander@2168
   466
  if( (pCol = pTable->aCol)!=0 ){
dvander@2168
   467
    for(i=0; i<pTable->nCol; i++, pCol++){
dvander@2168
   468
      sqlite3_free(pCol->zName);
dvander@2168
   469
      sqlite3ExprDelete(pCol->pDflt);
dvander@2168
   470
      sqlite3_free(pCol->zType);
dvander@2168
   471
      sqlite3_free(pCol->zColl);
dvander@2168
   472
    }
dvander@2168
   473
    sqlite3_free(pTable->aCol);
dvander@2168
   474
  }
dvander@2168
   475
  pTable->aCol = 0;
dvander@2168
   476
  pTable->nCol = 0;
dvander@2168
   477
}
dvander@2168
   478
dvander@2168
   479
/*
dvander@2168
   480
** Remove the memory data structures associated with the given
dvander@2168
   481
** Table.  No changes are made to disk by this routine.
dvander@2168
   482
**
dvander@2168
   483
** This routine just deletes the data structure.  It does not unlink
dvander@2168
   484
** the table data structure from the hash table.  Nor does it remove
dvander@2168
   485
** foreign keys from the sqlite.aFKey hash table.  But it does destroy
dvander@2168
   486
** memory structures of the indices and foreign keys associated with 
dvander@2168
   487
** the table.
dvander@2168
   488
*/
dvander@2168
   489
void sqlite3DeleteTable(Table *pTable){
dvander@2168
   490
  Index *pIndex, *pNext;
dvander@2168
   491
  FKey *pFKey, *pNextFKey;
dvander@2168
   492
dvander@2168
   493
  if( pTable==0 ) return;
dvander@2168
   494
dvander@2168
   495
  /* Do not delete the table until the reference count reaches zero. */
dvander@2168
   496
  pTable->nRef--;
dvander@2168
   497
  if( pTable->nRef>0 ){
dvander@2168
   498
    return;
dvander@2168
   499
  }
dvander@2168
   500
  assert( pTable->nRef==0 );
dvander@2168
   501
dvander@2168
   502
  /* Delete all indices associated with this table
dvander@2168
   503
  */
dvander@2168
   504
  for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){
dvander@2168
   505
    pNext = pIndex->pNext;
dvander@2168
   506
    assert( pIndex->pSchema==pTable->pSchema );
dvander@2168
   507
    sqliteDeleteIndex(pIndex);
dvander@2168
   508
  }
dvander@2168
   509
dvander@2168
   510
#ifndef SQLITE_OMIT_FOREIGN_KEY
dvander@2168
   511
  /* Delete all foreign keys associated with this table.  The keys
dvander@2168
   512
  ** should have already been unlinked from the pSchema->aFKey hash table 
dvander@2168
   513
  */
dvander@2168
   514
  for(pFKey=pTable->pFKey; pFKey; pFKey=pNextFKey){
dvander@2168
   515
    pNextFKey = pFKey->pNextFrom;
dvander@2168
   516
    assert( sqlite3HashFind(&pTable->pSchema->aFKey,
dvander@2168
   517
                           pFKey->zTo, strlen(pFKey->zTo)+1)!=pFKey );
dvander@2168
   518
    sqlite3_free(pFKey);
dvander@2168
   519
  }
dvander@2168
   520
#endif
dvander@2168
   521
dvander@2168
   522
  /* Delete the Table structure itself.
dvander@2168
   523
  */
dvander@2168
   524
  sqliteResetColumnNames(pTable);
dvander@2168
   525
  sqlite3_free(pTable->zName);
dvander@2168
   526
  sqlite3_free(pTable->zColAff);
dvander@2168
   527
  sqlite3SelectDelete(pTable->pSelect);
dvander@2168
   528
#ifndef SQLITE_OMIT_CHECK
dvander@2168
   529
  sqlite3ExprDelete(pTable->pCheck);
dvander@2168
   530
#endif
dvander@2168
   531
  sqlite3VtabClear(pTable);
dvander@2168
   532
  sqlite3_free(pTable);
dvander@2168
   533
}
dvander@2168
   534
dvander@2168
   535
/*
dvander@2168
   536
** Unlink the given table from the hash tables and the delete the
dvander@2168
   537
** table structure with all its indices and foreign keys.
dvander@2168
   538
*/
dvander@2168
   539
void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){
dvander@2168
   540
  Table *p;
dvander@2168
   541
  FKey *pF1, *pF2;
dvander@2168
   542
  Db *pDb;
dvander@2168
   543
dvander@2168
   544
  assert( db!=0 );
dvander@2168
   545
  assert( iDb>=0 && iDb<db->nDb );
dvander@2168
   546
  assert( zTabName && zTabName[0] );
dvander@2168
   547
  pDb = &db->aDb[iDb];
dvander@2168
   548
  p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName, strlen(zTabName)+1,0);
dvander@2168
   549
  if( p ){
dvander@2168
   550
#ifndef SQLITE_OMIT_FOREIGN_KEY
dvander@2168
   551
    for(pF1=p->pFKey; pF1; pF1=pF1->pNextFrom){
dvander@2168
   552
      int nTo = strlen(pF1->zTo) + 1;
dvander@2168
   553
      pF2 = sqlite3HashFind(&pDb->pSchema->aFKey, pF1->zTo, nTo);
dvander@2168
   554
      if( pF2==pF1 ){
dvander@2168
   555
        sqlite3HashInsert(&pDb->pSchema->aFKey, pF1->zTo, nTo, pF1->pNextTo);
dvander@2168
   556
      }else{
dvander@2168
   557
        while( pF2 && pF2->pNextTo!=pF1 ){ pF2=pF2->pNextTo; }
dvander@2168
   558
        if( pF2 ){
dvander@2168
   559
          pF2->pNextTo = pF1->pNextTo;
dvander@2168
   560
        }
dvander@2168
   561
      }
dvander@2168
   562
    }
dvander@2168
   563
#endif
dvander@2168
   564
    sqlite3DeleteTable(p);
dvander@2168
   565
  }
dvander@2168
   566
  db->flags |= SQLITE_InternChanges;
dvander@2168
   567
}
dvander@2168
   568
dvander@2168
   569
/*
dvander@2168
   570
** Given a token, return a string that consists of the text of that
dvander@2168
   571
** token with any quotations removed.  Space to hold the returned string
dvander@2168
   572
** is obtained from sqliteMalloc() and must be freed by the calling
dvander@2168
   573
** function.
dvander@2168
   574
**
dvander@2168
   575
** Tokens are often just pointers into the original SQL text and so
dvander@2168
   576
** are not \000 terminated and are not persistent.  The returned string
dvander@2168
   577
** is \000 terminated and is persistent.
dvander@2168
   578
*/
dvander@2168
   579
char *sqlite3NameFromToken(sqlite3 *db, Token *pName){
dvander@2168
   580
  char *zName;
dvander@2168
   581
  if( pName ){
dvander@2168
   582
    zName = sqlite3DbStrNDup(db, (char*)pName->z, pName->n);
dvander@2168
   583
    sqlite3Dequote(zName);
dvander@2168
   584
  }else{
dvander@2168
   585
    zName = 0;
dvander@2168
   586
  }
dvander@2168
   587
  return zName;
dvander@2168
   588
}
dvander@2168
   589
dvander@2168
   590
/*
dvander@2168
   591
** Open the sqlite_master table stored in database number iDb for
dvander@2168
   592
** writing. The table is opened using cursor 0.
dvander@2168
   593
*/
dvander@2168
   594
void sqlite3OpenMasterTable(Parse *p, int iDb){
dvander@2168
   595
  Vdbe *v = sqlite3GetVdbe(p);
dvander@2168
   596
  sqlite3TableLock(p, iDb, MASTER_ROOT, 1, SCHEMA_TABLE(iDb));
dvander@2168
   597
  sqlite3VdbeAddOp(v, OP_Integer, iDb, 0);
dvander@2168
   598
  sqlite3VdbeAddOp(v, OP_OpenWrite, 0, MASTER_ROOT);
dvander@2168
   599
  sqlite3VdbeAddOp(v, OP_SetNumColumns, 0, 5); /* sqlite_master has 5 columns */
dvander@2168
   600
}
dvander@2168
   601
dvander@2168
   602
/*
dvander@2168
   603
** The token *pName contains the name of a database (either "main" or
dvander@2168
   604
** "temp" or the name of an attached db). This routine returns the
dvander@2168
   605
** index of the named database in db->aDb[], or -1 if the named db 
dvander@2168
   606
** does not exist.
dvander@2168
   607
*/
dvander@2168
   608
int sqlite3FindDb(sqlite3 *db, Token *pName){
dvander@2168
   609
  int i = -1;    /* Database number */
dvander@2168
   610
  int n;         /* Number of characters in the name */
dvander@2168
   611
  Db *pDb;       /* A database whose name space is being searched */
dvander@2168
   612
  char *zName;   /* Name we are searching for */
dvander@2168
   613
dvander@2168
   614
  zName = sqlite3NameFromToken(db, pName);
dvander@2168
   615
  if( zName ){
dvander@2168
   616
    n = strlen(zName);
dvander@2168
   617
    for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){
dvander@2168
   618
      if( (!OMIT_TEMPDB || i!=1 ) && n==strlen(pDb->zName) && 
dvander@2168
   619
          0==sqlite3StrICmp(pDb->zName, zName) ){
dvander@2168
   620
        break;
dvander@2168
   621
      }
dvander@2168
   622
    }
dvander@2168
   623
    sqlite3_free(zName);
dvander@2168
   624
  }
dvander@2168
   625
  return i;
dvander@2168
   626
}
dvander@2168
   627
dvander@2168
   628
/* The table or view or trigger name is passed to this routine via tokens
dvander@2168
   629
** pName1 and pName2. If the table name was fully qualified, for example:
dvander@2168
   630
**
dvander@2168
   631
** CREATE TABLE xxx.yyy (...);
dvander@2168
   632
** 
dvander@2168
   633
** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if
dvander@2168
   634
** the table name is not fully qualified, i.e.:
dvander@2168
   635
**
dvander@2168
   636
** CREATE TABLE yyy(...);
dvander@2168
   637
**
dvander@2168
   638
** Then pName1 is set to "yyy" and pName2 is "".
dvander@2168
   639
**
dvander@2168
   640
** This routine sets the *ppUnqual pointer to point at the token (pName1 or
dvander@2168
   641
** pName2) that stores the unqualified table name.  The index of the
dvander@2168
   642
** database "xxx" is returned.
dvander@2168
   643
*/
dvander@2168
   644
int sqlite3TwoPartName(
dvander@2168
   645
  Parse *pParse,      /* Parsing and code generating context */
dvander@2168
   646
  Token *pName1,      /* The "xxx" in the name "xxx.yyy" or "xxx" */
dvander@2168
   647
  Token *pName2,      /* The "yyy" in the name "xxx.yyy" */
dvander@2168
   648
  Token **pUnqual     /* Write the unqualified object name here */
dvander@2168
   649
){
dvander@2168
   650
  int iDb;                    /* Database holding the object */
dvander@2168
   651
  sqlite3 *db = pParse->db;
dvander@2168
   652
dvander@2168
   653
  if( pName2 && pName2->n>0 ){
dvander@2168
   654
    assert( !db->init.busy );
dvander@2168
   655
    *pUnqual = pName2;
dvander@2168
   656
    iDb = sqlite3FindDb(db, pName1);
dvander@2168
   657
    if( iDb<0 ){
dvander@2168
   658
      sqlite3ErrorMsg(pParse, "unknown database %T", pName1);
dvander@2168
   659
      pParse->nErr++;
dvander@2168
   660
      return -1;
dvander@2168
   661
    }
dvander@2168
   662
  }else{
dvander@2168
   663
    assert( db->init.iDb==0 || db->init.busy );
dvander@2168
   664
    iDb = db->init.iDb;
dvander@2168
   665
    *pUnqual = pName1;
dvander@2168
   666
  }
dvander@2168
   667
  return iDb;
dvander@2168
   668
}
dvander@2168
   669
dvander@2168
   670
/*
dvander@2168
   671
** This routine is used to check if the UTF-8 string zName is a legal
dvander@2168
   672
** unqualified name for a new schema object (table, index, view or
dvander@2168
   673
** trigger). All names are legal except those that begin with the string
dvander@2168
   674
** "sqlite_" (in upper, lower or mixed case). This portion of the namespace
dvander@2168
   675
** is reserved for internal use.
dvander@2168
   676
*/
dvander@2168
   677
int sqlite3CheckObjectName(Parse *pParse, const char *zName){
dvander@2168
   678
  if( !pParse->db->init.busy && pParse->nested==0 
dvander@2168
   679
          && (pParse->db->flags & SQLITE_WriteSchema)==0
dvander@2168
   680
          && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){
dvander@2168
   681
    sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName);
dvander@2168
   682
    return SQLITE_ERROR;
dvander@2168
   683
  }
dvander@2168
   684
  return SQLITE_OK;
dvander@2168
   685
}
dvander@2168
   686
dvander@2168
   687
/*
dvander@2168
   688
** Begin constructing a new table representation in memory.  This is
dvander@2168
   689
** the first of several action routines that get called in response
dvander@2168
   690
** to a CREATE TABLE statement.  In particular, this routine is called
dvander@2168
   691
** after seeing tokens "CREATE" and "TABLE" and the table name. The isTemp
dvander@2168
   692
** flag is true if the table should be stored in the auxiliary database
dvander@2168
   693
** file instead of in the main database file.  This is normally the case
dvander@2168
   694
** when the "TEMP" or "TEMPORARY" keyword occurs in between
dvander@2168
   695
** CREATE and TABLE.
dvander@2168
   696
**
dvander@2168
   697
** The new table record is initialized and put in pParse->pNewTable.
dvander@2168
   698
** As more of the CREATE TABLE statement is parsed, additional action
dvander@2168
   699
** routines will be called to add more information to this record.
dvander@2168
   700
** At the end of the CREATE TABLE statement, the sqlite3EndTable() routine
dvander@2168
   701
** is called to complete the construction of the new table record.
dvander@2168
   702
*/
dvander@2168
   703
void sqlite3StartTable(
dvander@2168
   704
  Parse *pParse,   /* Parser context */
dvander@2168
   705
  Token *pName1,   /* First part of the name of the table or view */
dvander@2168
   706
  Token *pName2,   /* Second part of the name of the table or view */
dvander@2168
   707
  int isTemp,      /* True if this is a TEMP table */
dvander@2168
   708
  int isView,      /* True if this is a VIEW */
dvander@2168
   709
  int isVirtual,   /* True if this is a VIRTUAL table */
dvander@2168
   710
  int noErr        /* Do nothing if table already exists */
dvander@2168
   711
){
dvander@2168
   712
  Table *pTable;
dvander@2168
   713
  char *zName = 0; /* The name of the new table */
dvander@2168
   714
  sqlite3 *db = pParse->db;
dvander@2168
   715
  Vdbe *v;
dvander@2168
   716
  int iDb;         /* Database number to create the table in */
dvander@2168
   717
  Token *pName;    /* Unqualified name of the table to create */
dvander@2168
   718
dvander@2168
   719
  /* The table or view name to create is passed to this routine via tokens
dvander@2168
   720
  ** pName1 and pName2. If the table name was fully qualified, for example:
dvander@2168
   721
  **
dvander@2168
   722
  ** CREATE TABLE xxx.yyy (...);
dvander@2168
   723
  ** 
dvander@2168
   724
  ** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if
dvander@2168
   725
  ** the table name is not fully qualified, i.e.:
dvander@2168
   726
  **
dvander@2168
   727
  ** CREATE TABLE yyy(...);
dvander@2168
   728
  **
dvander@2168
   729
  ** Then pName1 is set to "yyy" and pName2 is "".
dvander@2168
   730
  **
dvander@2168
   731
  ** The call below sets the pName pointer to point at the token (pName1 or
dvander@2168
   732
  ** pName2) that stores the unqualified table name. The variable iDb is
dvander@2168
   733
  ** set to the index of the database that the table or view is to be
dvander@2168
   734
  ** created in.
dvander@2168
   735
  */
dvander@2168
   736
  iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
dvander@2168
   737
  if( iDb<0 ) return;
dvander@2168
   738
  if( !OMIT_TEMPDB && isTemp && iDb>1 ){
dvander@2168
   739
    /* If creating a temp table, the name may not be qualified */
dvander@2168
   740
    sqlite3ErrorMsg(pParse, "temporary table name must be unqualified");
dvander@2168
   741
    return;
dvander@2168
   742
  }
dvander@2168
   743
  if( !OMIT_TEMPDB && isTemp ) iDb = 1;
dvander@2168
   744
dvander@2168
   745
  pParse->sNameToken = *pName;
dvander@2168
   746
  zName = sqlite3NameFromToken(db, pName);
dvander@2168
   747
  if( zName==0 ) return;
dvander@2168
   748
  if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
dvander@2168
   749
    goto begin_table_error;
dvander@2168
   750
  }
dvander@2168
   751
  if( db->init.iDb==1 ) isTemp = 1;
dvander@2168
   752
#ifndef SQLITE_OMIT_AUTHORIZATION
dvander@2168
   753
  assert( (isTemp & 1)==isTemp );
dvander@2168
   754
  {
dvander@2168
   755
    int code;
dvander@2168
   756
    char *zDb = db->aDb[iDb].zName;
dvander@2168
   757
    if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){
dvander@2168
   758
      goto begin_table_error;
dvander@2168
   759
    }
dvander@2168
   760
    if( isView ){
dvander@2168
   761
      if( !OMIT_TEMPDB && isTemp ){
dvander@2168
   762
        code = SQLITE_CREATE_TEMP_VIEW;
dvander@2168
   763
      }else{
dvander@2168
   764
        code = SQLITE_CREATE_VIEW;
dvander@2168
   765
      }
dvander@2168
   766
    }else{
dvander@2168
   767
      if( !OMIT_TEMPDB && isTemp ){
dvander@2168
   768
        code = SQLITE_CREATE_TEMP_TABLE;
dvander@2168
   769
      }else{
dvander@2168
   770
        code = SQLITE_CREATE_TABLE;
dvander@2168
   771
      }
dvander@2168
   772
    }
dvander@2168
   773
    if( !isVirtual && sqlite3AuthCheck(pParse, code, zName, 0, zDb) ){
dvander@2168
   774
      goto begin_table_error;
dvander@2168
   775
    }
dvander@2168
   776
  }
dvander@2168
   777
#endif
dvander@2168
   778
dvander@2168
   779
  /* Make sure the new table name does not collide with an existing
dvander@2168
   780
  ** index or table name in the same database.  Issue an error message if
dvander@2168
   781
  ** it does. The exception is if the statement being parsed was passed
dvander@2168
   782
  ** to an sqlite3_declare_vtab() call. In that case only the column names
dvander@2168
   783
  ** and types will be used, so there is no need to test for namespace
dvander@2168
   784
  ** collisions.
dvander@2168
   785
  */
dvander@2168
   786
  if( !IN_DECLARE_VTAB ){
dvander@2168
   787
    if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
dvander@2168
   788
      goto begin_table_error;
dvander@2168
   789
    }
dvander@2168
   790
    pTable = sqlite3FindTable(db, zName, db->aDb[iDb].zName);
dvander@2168
   791
    if( pTable ){
dvander@2168
   792
      if( !noErr ){
dvander@2168
   793
        sqlite3ErrorMsg(pParse, "table %T already exists", pName);
dvander@2168
   794
      }
dvander@2168
   795
      goto begin_table_error;
dvander@2168
   796
    }
dvander@2168
   797
    if( sqlite3FindIndex(db, zName, 0)!=0 && (iDb==0 || !db->init.busy) ){
dvander@2168
   798
      sqlite3ErrorMsg(pParse, "there is already an index named %s", zName);
dvander@2168
   799
      goto begin_table_error;
dvander@2168
   800
    }
dvander@2168
   801
  }
dvander@2168
   802
dvander@2168
   803
  pTable = sqlite3DbMallocZero(db, sizeof(Table));
dvander@2168
   804
  if( pTable==0 ){
dvander@2168
   805
    db->mallocFailed = 1;
dvander@2168
   806
    pParse->rc = SQLITE_NOMEM;
dvander@2168
   807
    pParse->nErr++;
dvander@2168
   808
    goto begin_table_error;
dvander@2168
   809
  }
dvander@2168
   810
  pTable->zName = zName;
dvander@2168
   811
  pTable->iPKey = -1;
dvander@2168
   812
  pTable->pSchema = db->aDb[iDb].pSchema;
dvander@2168
   813
  pTable->nRef = 1;
dvander@2168
   814
  if( pParse->pNewTable ) sqlite3DeleteTable(pParse->pNewTable);
dvander@2168
   815
  pParse->pNewTable = pTable;
dvander@2168
   816
dvander@2168
   817
  /* If this is the magic sqlite_sequence table used by autoincrement,
dvander@2168
   818
  ** then record a pointer to this table in the main database structure
dvander@2168
   819
  ** so that INSERT can find the table easily.
dvander@2168
   820
  */
dvander@2168
   821
#ifndef SQLITE_OMIT_AUTOINCREMENT
dvander@2168
   822
  if( !pParse->nested && strcmp(zName, "sqlite_sequence")==0 ){
dvander@2168
   823
    pTable->pSchema->pSeqTab = pTable;
dvander@2168
   824
  }
dvander@2168
   825
#endif
dvander@2168
   826
dvander@2168
   827
  /* Begin generating the code that will insert the table record into
dvander@2168
   828
  ** the SQLITE_MASTER table.  Note in particular that we must go ahead
dvander@2168
   829
  ** and allocate the record number for the table entry now.  Before any
dvander@2168
   830
  ** PRIMARY KEY or UNIQUE keywords are parsed.  Those keywords will cause
dvander@2168
   831
  ** indices to be created and the table record must come before the 
dvander@2168
   832
  ** indices.  Hence, the record number for the table must be allocated
dvander@2168
   833
  ** now.
dvander@2168
   834
  */
dvander@2168
   835
  if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){
dvander@2168
   836
    int lbl;
dvander@2168
   837
    int fileFormat;
dvander@2168
   838
    sqlite3BeginWriteOperation(pParse, 0, iDb);
dvander@2168
   839
dvander@2168
   840
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@2168
   841
    if( isVirtual ){
dvander@2168
   842
      sqlite3VdbeAddOp(v, OP_VBegin, 0, 0);
dvander@2168
   843
    }
dvander@2168
   844
#endif
dvander@2168
   845
dvander@2168
   846
    /* If the file format and encoding in the database have not been set, 
dvander@2168
   847
    ** set them now.
dvander@2168
   848
    */
dvander@2168
   849
    sqlite3VdbeAddOp(v, OP_ReadCookie, iDb, 1);   /* file_format */
dvander@2168
   850
    sqlite3VdbeUsesBtree(v, iDb);
dvander@2168
   851
    lbl = sqlite3VdbeMakeLabel(v);
dvander@2168
   852
    sqlite3VdbeAddOp(v, OP_If, 0, lbl);
dvander@2168
   853
    fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ?
dvander@2168
   854
                  1 : SQLITE_MAX_FILE_FORMAT;
dvander@2168
   855
    sqlite3VdbeAddOp(v, OP_Integer, fileFormat, 0);
dvander@2168
   856
    sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 1);
dvander@2168
   857
    sqlite3VdbeAddOp(v, OP_Integer, ENC(db), 0);
dvander@2168
   858
    sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 4);
dvander@2168
   859
    sqlite3VdbeResolveLabel(v, lbl);
dvander@2168
   860
dvander@2168
   861
    /* This just creates a place-holder record in the sqlite_master table.
dvander@2168
   862
    ** The record created does not contain anything yet.  It will be replaced
dvander@2168
   863
    ** by the real entry in code generated at sqlite3EndTable().
dvander@2168
   864
    **
dvander@2168
   865
    ** The rowid for the new entry is left on the top of the stack.
dvander@2168
   866
    ** The rowid value is needed by the code that sqlite3EndTable will
dvander@2168
   867
    ** generate.
dvander@2168
   868
    */
dvander@2168
   869
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
dvander@2168
   870
    if( isView || isVirtual ){
dvander@2168
   871
      sqlite3VdbeAddOp(v, OP_Integer, 0, 0);
dvander@2168
   872
    }else
dvander@2168
   873
#endif
dvander@2168
   874
    {
dvander@2168
   875
      sqlite3VdbeAddOp(v, OP_CreateTable, iDb, 0);
dvander@2168
   876
    }
dvander@2168
   877
    sqlite3OpenMasterTable(pParse, iDb);
dvander@2168
   878
    sqlite3VdbeAddOp(v, OP_NewRowid, 0, 0);
dvander@2168
   879
    sqlite3VdbeAddOp(v, OP_Dup, 0, 0);
dvander@2168
   880
    sqlite3VdbeAddOp(v, OP_Null, 0, 0);
dvander@2168
   881
    sqlite3VdbeAddOp(v, OP_Insert, 0, OPFLAG_APPEND);
dvander@2168
   882
    sqlite3VdbeAddOp(v, OP_Close, 0, 0);
dvander@2168
   883
    sqlite3VdbeAddOp(v, OP_Pull, 1, 0);
dvander@2168
   884
  }
dvander@2168
   885
dvander@2168
   886
  /* Normal (non-error) return. */
dvander@2168
   887
  return;
dvander@2168
   888
dvander@2168
   889
  /* If an error occurs, we jump here */
dvander@2168
   890
begin_table_error:
dvander@2168
   891
  sqlite3_free(zName);
dvander@2168
   892
  return;
dvander@2168
   893
}
dvander@2168
   894
dvander@2168
   895
/*
dvander@2168
   896
** This macro is used to compare two strings in a case-insensitive manner.
dvander@2168
   897
** It is slightly faster than calling sqlite3StrICmp() directly, but
dvander@2168
   898
** produces larger code.
dvander@2168
   899
**
dvander@2168
   900
** WARNING: This macro is not compatible with the strcmp() family. It
dvander@2168
   901
** returns true if the two strings are equal, otherwise false.
dvander@2168
   902
*/
dvander@2168
   903
#define STRICMP(x, y) (\
dvander@2168
   904
sqlite3UpperToLower[*(unsigned char *)(x)]==   \
dvander@2168
   905
sqlite3UpperToLower[*(unsigned char *)(y)]     \
dvander@2168
   906
&& sqlite3StrICmp((x)+1,(y)+1)==0 )
dvander@2168
   907
dvander@2168
   908
/*
dvander@2168
   909
** Add a new column to the table currently being constructed.
dvander@2168
   910
**
dvander@2168
   911
** The parser calls this routine once for each column declaration
dvander@2168
   912
** in a CREATE TABLE statement.  sqlite3StartTable() gets called
dvander@2168
   913
** first to get things going.  Then this routine is called for each
dvander@2168
   914
** column.
dvander@2168
   915
*/
dvander@2168
   916
void sqlite3AddColumn(Parse *pParse, Token *pName){
dvander@2168
   917
  Table *p;
dvander@2168
   918
  int i;
dvander@2168
   919
  char *z;
dvander@2168
   920
  Column *pCol;
dvander@2168
   921
  if( (p = pParse->pNewTable)==0 ) return;
dvander@2168
   922
  if( p->nCol+1>SQLITE_MAX_COLUMN ){
dvander@2168
   923
    sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName);
dvander@2168
   924
    return;
dvander@2168
   925
  }
dvander@2168
   926
  z = sqlite3NameFromToken(pParse->db, pName);
dvander@2168
   927
  if( z==0 ) return;
dvander@2168
   928
  for(i=0; i<p->nCol; i++){
dvander@2168
   929
    if( STRICMP(z, p->aCol[i].zName) ){
dvander@2168
   930
      sqlite3ErrorMsg(pParse, "duplicate column name: %s", z);
dvander@2168
   931
      sqlite3_free(z);
dvander@2168
   932
      return;
dvander@2168
   933
    }
dvander@2168
   934
  }
dvander@2168
   935
  if( (p->nCol & 0x7)==0 ){
dvander@2168
   936
    Column *aNew;
dvander@2168
   937
    aNew = sqlite3DbRealloc(pParse->db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0]));
dvander@2168
   938
    if( aNew==0 ){
dvander@2168
   939
      sqlite3_free(z);
dvander@2168
   940
      return;
dvander@2168
   941
    }
dvander@2168
   942
    p->aCol = aNew;
dvander@2168
   943
  }
dvander@2168
   944
  pCol = &p->aCol[p->nCol];
dvander@2168
   945
  memset(pCol, 0, sizeof(p->aCol[0]));
dvander@2168
   946
  pCol->zName = z;
dvander@2168
   947
 
dvander@2168
   948
  /* If there is no type specified, columns have the default affinity
dvander@2168
   949
  ** 'NONE'. If there is a type specified, then sqlite3AddColumnType() will
dvander@2168
   950
  ** be called next to set pCol->affinity correctly.
dvander@2168
   951
  */
dvander@2168
   952
  pCol->affinity = SQLITE_AFF_NONE;
dvander@2168
   953
  p->nCol++;
dvander@2168
   954
}
dvander@2168
   955
dvander@2168
   956
/*
dvander@2168
   957
** This routine is called by the parser while in the middle of
dvander@2168
   958
** parsing a CREATE TABLE statement.  A "NOT NULL" constraint has
dvander@2168
   959
** been seen on a column.  This routine sets the notNull flag on
dvander@2168
   960
** the column currently under construction.
dvander@2168
   961
*/
dvander@2168
   962
void sqlite3AddNotNull(Parse *pParse, int onError){
dvander@2168
   963
  Table *p;
dvander@2168
   964
  int i;
dvander@2168
   965
  if( (p = pParse->pNewTable)==0 ) return;
dvander@2168
   966
  i = p->nCol-1;
dvander@2168
   967
  if( i>=0 ) p->aCol[i].notNull = onError;
dvander@2168
   968
}
dvander@2168
   969
dvander@2168
   970
/*
dvander@2168
   971
** Scan the column type name zType (length nType) and return the
dvander@2168
   972
** associated affinity type.
dvander@2168
   973
**
dvander@2168
   974
** This routine does a case-independent search of zType for the 
dvander@2168
   975
** substrings in the following table. If one of the substrings is
dvander@2168
   976
** found, the corresponding affinity is returned. If zType contains
dvander@2168
   977
** more than one of the substrings, entries toward the top of 
dvander@2168
   978
** the table take priority. For example, if zType is 'BLOBINT', 
dvander@2168
   979
** SQLITE_AFF_INTEGER is returned.
dvander@2168
   980
**
dvander@2168
   981
** Substring     | Affinity
dvander@2168
   982
** --------------------------------
dvander@2168
   983
** 'INT'         | SQLITE_AFF_INTEGER
dvander@2168
   984
** 'CHAR'        | SQLITE_AFF_TEXT
dvander@2168
   985
** 'CLOB'        | SQLITE_AFF_TEXT
dvander@2168
   986
** 'TEXT'        | SQLITE_AFF_TEXT
dvander@2168
   987
** 'BLOB'        | SQLITE_AFF_NONE
dvander@2168
   988
** 'REAL'        | SQLITE_AFF_REAL
dvander@2168
   989
** 'FLOA'        | SQLITE_AFF_REAL
dvander@2168
   990
** 'DOUB'        | SQLITE_AFF_REAL
dvander@2168
   991
**
dvander@2168
   992
** If none of the substrings in the above table are found,
dvander@2168
   993
** SQLITE_AFF_NUMERIC is returned.
dvander@2168
   994
*/
dvander@2168
   995
char sqlite3AffinityType(const Token *pType){
dvander@2168
   996
  u32 h = 0;
dvander@2168
   997
  char aff = SQLITE_AFF_NUMERIC;
dvander@2168
   998
  const unsigned char *zIn = pType->z;
dvander@2168
   999
  const unsigned char *zEnd = &pType->z[pType->n];
dvander@2168
  1000
dvander@2168
  1001
  while( zIn!=zEnd ){
dvander@2168
  1002
    h = (h<<8) + sqlite3UpperToLower[*zIn];
dvander@2168
  1003
    zIn++;
dvander@2168
  1004
    if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){             /* CHAR */
dvander@2168
  1005
      aff = SQLITE_AFF_TEXT; 
dvander@2168
  1006
    }else if( h==(('c'<<24)+('l'<<16)+('o'<<8)+'b') ){       /* CLOB */
dvander@2168
  1007
      aff = SQLITE_AFF_TEXT;
dvander@2168
  1008
    }else if( h==(('t'<<24)+('e'<<16)+('x'<<8)+'t') ){       /* TEXT */
dvander@2168
  1009
      aff = SQLITE_AFF_TEXT;
dvander@2168
  1010
    }else if( h==(('b'<<24)+('l'<<16)+('o'<<8)+'b')          /* BLOB */
dvander@2168
  1011
        && (aff==SQLITE_AFF_NUMERIC || aff==SQLITE_AFF_REAL) ){
dvander@2168
  1012
      aff = SQLITE_AFF_NONE;
dvander@2168
  1013
#ifndef SQLITE_OMIT_FLOATING_POINT
dvander@2168
  1014
    }else if( h==(('r'<<24)+('e'<<16)+('a'<<8)+'l')          /* REAL */
dvander@2168
  1015
        && aff==SQLITE_AFF_NUMERIC ){
dvander@2168
  1016
      aff = SQLITE_AFF_REAL;
dvander@2168
  1017
    }else if( h==(('f'<<24)+('l'<<16)+('o'<<8)+'a')          /* FLOA */
dvander@2168
  1018
        && aff==SQLITE_AFF_NUMERIC ){
dvander@2168
  1019
      aff = SQLITE_AFF_REAL;
dvander@2168
  1020
    }else if( h==(('d'<<24)+('o'<<16)+('u'<<8)+'b')          /* DOUB */
dvander@2168
  1021
        && aff==SQLITE_AFF_NUMERIC ){
dvander@2168
  1022
      aff = SQLITE_AFF_REAL;
dvander@2168
  1023
#endif
dvander@2168
  1024
    }else if( (h&0x00FFFFFF)==(('i'<<16)+('n'<<8)+'t') ){    /* INT */
dvander@2168
  1025
      aff = SQLITE_AFF_INTEGER;
dvander@2168
  1026
      break;
dvander@2168
  1027
    }
dvander@2168
  1028
  }
dvander@2168
  1029
dvander@2168
  1030
  return aff;
dvander@2168
  1031
}
dvander@2168
  1032
dvander@2168
  1033
/*
dvander@2168
  1034
** This routine is called by the parser while in the middle of
dvander@2168
  1035
** parsing a CREATE TABLE statement.  The pFirst token is the first
dvander@2168
  1036
** token in the sequence of tokens that describe the type of the
dvander@2168
  1037
** column currently under construction.   pLast is the last token
dvander@2168
  1038
** in the sequence.  Use this information to construct a string
dvander@2168
  1039
** that contains the typename of the column and store that string
dvander@2168
  1040
** in zType.
dvander@2168
  1041
*/ 
dvander@2168
  1042
void sqlite3AddColumnType(Parse *pParse, Token *pType){
dvander@2168
  1043
  Table *p;
dvander@2168
  1044
  int i;
dvander@2168
  1045
  Column *pCol;
dvander@2168
  1046
dvander@2168
  1047
  if( (p = pParse->pNewTable)==0 ) return;
dvander@2168
  1048
  i = p->nCol-1;
dvander@2168
  1049
  if( i<0 ) return;
dvander@2168
  1050
  pCol = &p->aCol[i];
dvander@2168
  1051
  sqlite3_free(pCol->zType);
dvander@2168
  1052
  pCol->zType = sqlite3NameFromToken(pParse->db, pType);
dvander@2168
  1053
  pCol->affinity = sqlite3AffinityType(pType);
dvander@2168
  1054
}
dvander@2168
  1055
dvander@2168
  1056
/*
dvander@2168
  1057
** The expression is the default value for the most recently added column
dvander@2168
  1058
** of the table currently under construction.
dvander@2168
  1059
**
dvander@2168
  1060
** Default value expressions must be constant.  Raise an exception if this
dvander@2168
  1061
** is not the case.
dvander@2168
  1062
**
dvander@2168
  1063
** This routine is called by the parser while in the middle of
dvander@2168
  1064
** parsing a CREATE TABLE statement.
dvander@2168
  1065
*/
dvander@2168
  1066
void sqlite3AddDefaultValue(Parse *pParse, Expr *pExpr){
dvander@2168
  1067
  Table *p;
dvander@2168
  1068
  Column *pCol;
dvander@2168
  1069
  if( (p = pParse->pNewTable)!=0 ){
dvander@2168
  1070
    pCol = &(p->aCol[p->nCol-1]);
dvander@2168
  1071
    if( !sqlite3ExprIsConstantOrFunction(pExpr) ){
dvander@2168
  1072
      sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant",
dvander@2168
  1073
          pCol->zName);
dvander@2168
  1074
    }else{
dvander@2168
  1075
      Expr *pCopy;
dvander@2168
  1076
      sqlite3 *db = pParse->db;
dvander@2168
  1077
      sqlite3ExprDelete(pCol->pDflt);
dvander@2168
  1078
      pCol->pDflt = pCopy = sqlite3ExprDup(db, pExpr);
dvander@2168
  1079
      if( pCopy ){
dvander@2168
  1080
        sqlite3TokenCopy(db, &pCopy->span, &pExpr->span);
dvander@2168
  1081
      }
dvander@2168
  1082
    }
dvander@2168
  1083
  }
dvander@2168
  1084
  sqlite3ExprDelete(pExpr);
dvander@2168
  1085
}
dvander@2168
  1086
dvander@2168
  1087
/*
dvander@2168
  1088
** Designate the PRIMARY KEY for the table.  pList is a list of names 
dvander@2168
  1089
** of columns that form the primary key.  If pList is NULL, then the
dvander@2168
  1090
** most recently added column of the table is the primary key.
dvander@2168
  1091
**
dvander@2168
  1092
** A table can have at most one primary key.  If the table already has
dvander@2168
  1093
** a primary key (and this is the second primary key) then create an
dvander@2168
  1094
** error.
dvander@2168
  1095
**
dvander@2168
  1096
** If the PRIMARY KEY is on a single column whose datatype is INTEGER,
dvander@2168
  1097
** then we will try to use that column as the rowid.  Set the Table.iPKey
dvander@2168
  1098
** field of the table under construction to be the index of the
dvander@2168
  1099
** INTEGER PRIMARY KEY column.  Table.iPKey is set to -1 if there is
dvander@2168
  1100
** no INTEGER PRIMARY KEY.
dvander@2168
  1101
**
dvander@2168
  1102
** If the key is not an INTEGER PRIMARY KEY, then create a unique
dvander@2168
  1103
** index for the key.  No index is created for INTEGER PRIMARY KEYs.
dvander@2168
  1104
*/
dvander@2168
  1105
void sqlite3AddPrimaryKey(
dvander@2168
  1106
  Parse *pParse,    /* Parsing context */
dvander@2168
  1107
  ExprList *pList,  /* List of field names to be indexed */
dvander@2168
  1108
  int onError,      /* What to do with a uniqueness conflict */
dvander@2168
  1109
  int autoInc,      /* True if the AUTOINCREMENT keyword is present */
dvander@2168
  1110
  int sortOrder     /* SQLITE_SO_ASC or SQLITE_SO_DESC */
dvander@2168
  1111
){
dvander@2168
  1112
  Table *pTab = pParse->pNewTable;
dvander@2168
  1113
  char *zType = 0;
dvander@2168
  1114
  int iCol = -1, i;
dvander@2168
  1115
  if( pTab==0 || IN_DECLARE_VTAB ) goto primary_key_exit;
dvander@2168
  1116
  if( pTab->hasPrimKey ){
dvander@2168
  1117
    sqlite3ErrorMsg(pParse, 
dvander@2168
  1118
      "table \"%s\" has more than one primary key", pTab->zName);
dvander@2168
  1119
    goto primary_key_exit;
dvander@2168
  1120
  }
dvander@2168
  1121
  pTab->hasPrimKey = 1;
dvander@2168
  1122
  if( pList==0 ){
dvander@2168
  1123
    iCol = pTab->nCol - 1;
dvander@2168
  1124
    pTab->aCol[iCol].isPrimKey = 1;
dvander@2168
  1125
  }else{
dvander@2168
  1126
    for(i=0; i<pList->nExpr; i++){
dvander@2168
  1127
      for(iCol=0; iCol<pTab->nCol; iCol++){
dvander@2168
  1128
        if( sqlite3StrICmp(pList->a[i].zName, pTab->aCol[iCol].zName)==0 ){
dvander@2168
  1129
          break;
dvander@2168
  1130
        }
dvander@2168
  1131
      }
dvander@2168
  1132
      if( iCol<pTab->nCol ){
dvander@2168
  1133
        pTab->aCol[iCol].isPrimKey = 1;
dvander@2168
  1134
      }
dvander@2168
  1135
    }
dvander@2168
  1136
    if( pList->nExpr>1 ) iCol = -1;
dvander@2168
  1137
  }
dvander@2168
  1138
  if( iCol>=0 && iCol<pTab->nCol ){
dvander@2168
  1139
    zType = pTab->aCol[iCol].zType;
dvander@2168
  1140
  }
dvander@2168
  1141
  if( zType && sqlite3StrICmp(zType, "INTEGER")==0
dvander@2168
  1142
        && sortOrder==SQLITE_SO_ASC ){
dvander@2168
  1143
    pTab->iPKey = iCol;
dvander@2168
  1144
    pTab->keyConf = onError;
dvander@2168
  1145
    pTab->autoInc = autoInc;
dvander@2168
  1146
  }else if( autoInc ){
dvander@2168
  1147
#ifndef SQLITE_OMIT_AUTOINCREMENT
dvander@2168
  1148
    sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an "
dvander@2168
  1149
       "INTEGER PRIMARY KEY");
dvander@2168
  1150
#endif
dvander@2168
  1151
  }else{
dvander@2168
  1152
    sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, 0, sortOrder, 0);
dvander@2168
  1153
    pList = 0;
dvander@2168
  1154
  }
dvander@2168
  1155
dvander@2168
  1156
primary_key_exit:
dvander@2168
  1157
  sqlite3ExprListDelete(pList);
dvander@2168
  1158
  return;
dvander@2168
  1159
}
dvander@2168
  1160
dvander@2168
  1161
/*
dvander@2168
  1162
** Add a new CHECK constraint to the table currently under construction.
dvander@2168
  1163
*/
dvander@2168
  1164
void sqlite3AddCheckConstraint(
dvander@2168
  1165
  Parse *pParse,    /* Parsing context */
dvander@2168
  1166
  Expr *pCheckExpr  /* The check expression */
dvander@2168
  1167
){
dvander@2168
  1168
#ifndef SQLITE_OMIT_CHECK
dvander@2168
  1169
  Table *pTab = pParse->pNewTable;
dvander@2168
  1170
  sqlite3 *db = pParse->db;
dvander@2168
  1171
  if( pTab && !IN_DECLARE_VTAB ){
dvander@2168
  1172
    /* The CHECK expression must be duplicated so that tokens refer
dvander@2168
  1173
    ** to malloced space and not the (ephemeral) text of the CREATE TABLE
dvander@2168
  1174
    ** statement */
dvander@2168
  1175
    pTab->pCheck = sqlite3ExprAnd(db, pTab->pCheck, 
dvander@2168
  1176
                                  sqlite3ExprDup(db, pCheckExpr));
dvander@2168
  1177
  }
dvander@2168
  1178
#endif
dvander@2168
  1179
  sqlite3ExprDelete(pCheckExpr);
dvander@2168
  1180
}
dvander@2168
  1181
dvander@2168
  1182
/*
dvander@2168
  1183
** Set the collation function of the most recently parsed table column
dvander@2168
  1184
** to the CollSeq given.
dvander@2168
  1185
*/
dvander@2168
  1186
void sqlite3AddCollateType(Parse *pParse, const char *zType, int nType){
dvander@2168
  1187
  Table *p;
dvander@2168
  1188
  int i;
dvander@2168
  1189
dvander@2168
  1190
  if( (p = pParse->pNewTable)==0 ) return;
dvander@2168
  1191
  i = p->nCol-1;
dvander@2168
  1192
dvander@2168
  1193
  if( sqlite3LocateCollSeq(pParse, zType, nType) ){
dvander@2168
  1194
    Index *pIdx;
dvander@2168
  1195
    p->aCol[i].zColl = sqlite3DbStrNDup(pParse->db, zType, nType);
dvander@2168
  1196
  
dvander@2168
  1197
    /* If the column is declared as "<name> PRIMARY KEY COLLATE <type>",
dvander@2168
  1198
    ** then an index may have been created on this column before the
dvander@2168
  1199
    ** collation type was added. Correct this if it is the case.
dvander@2168
  1200
    */
dvander@2168
  1201
    for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){
dvander@2168
  1202
      assert( pIdx->nColumn==1 );
dvander@2168
  1203
      if( pIdx->aiColumn[0]==i ){
dvander@2168
  1204
        pIdx->azColl[0] = p->aCol[i].zColl;
dvander@2168
  1205
      }
dvander@2168
  1206
    }
dvander@2168
  1207
  }
dvander@2168
  1208
}
dvander@2168
  1209
dvander@2168
  1210
/*
dvander@2168
  1211
** This function returns the collation sequence for database native text
dvander@2168
  1212
** encoding identified by the string zName, length nName.
dvander@2168
  1213
**
dvander@2168
  1214
** If the requested collation sequence is not available, or not available
dvander@2168
  1215
** in the database native encoding, the collation factory is invoked to
dvander@2168
  1216
** request it. If the collation factory does not supply such a sequence,
dvander@2168
  1217
** and the sequence is available in another text encoding, then that is
dvander@2168
  1218
** returned instead.
dvander@2168
  1219
**
dvander@2168
  1220
** If no versions of the requested collations sequence are available, or
dvander@2168
  1221
** another error occurs, NULL is returned and an error message written into
dvander@2168
  1222
** pParse.
dvander@2168
  1223
**
dvander@2168
  1224
** This routine is a wrapper around sqlite3FindCollSeq().  This routine
dvander@2168
  1225
** invokes the collation factory if the named collation cannot be found
dvander@2168
  1226
** and generates an error message.
dvander@2168
  1227
*/
dvander@2168
  1228
CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName, int nName){
dvander@2168
  1229
  sqlite3 *db = pParse->db;
dvander@2168
  1230
  u8 enc = ENC(db);
dvander@2168
  1231
  u8 initbusy = db->init.busy;
dvander@2168
  1232
  CollSeq *pColl;
dvander@2168
  1233
dvander@2168
  1234
  pColl = sqlite3FindCollSeq(db, enc, zName, nName, initbusy);
dvander@2168
  1235
  if( !initbusy && (!pColl || !pColl->xCmp) ){
dvander@2168
  1236
    pColl = sqlite3GetCollSeq(db, pColl, zName, nName);
dvander@2168
  1237
    if( !pColl ){
dvander@2168
  1238
      if( nName<0 ){
dvander@2168
  1239
        nName = strlen(zName);
dvander@2168
  1240
      }
dvander@2168
  1241
      sqlite3ErrorMsg(pParse, "no such collation sequence: %.*s", nName, zName);
dvander@2168
  1242
      pColl = 0;
dvander@2168
  1243
    }
dvander@2168
  1244
  }
dvander@2168
  1245
dvander@2168
  1246
  return pColl;
dvander@2168
  1247
}
dvander@2168
  1248
dvander@2168
  1249
dvander@2168
  1250
/*
dvander@2168
  1251
** Generate code that will increment the schema cookie.
dvander@2168
  1252
**
dvander@2168
  1253
** The schema cookie is used to determine when the schema for the
dvander@2168
  1254
** database changes.  After each schema change, the cookie value
dvander@2168
  1255
** changes.  When a process first reads the schema it records the
dvander@2168
  1256
** cookie.  Thereafter, whenever it goes to access the database,
dvander@2168
  1257
** it checks the cookie to make sure the schema has not changed
dvander@2168
  1258
** since it was last read.
dvander@2168
  1259
**
dvander@2168
  1260
** This plan is not completely bullet-proof.  It is possible for
dvander@2168
  1261
** the schema to change multiple times and for the cookie to be
dvander@2168
  1262
** set back to prior value.  But schema changes are infrequent
dvander@2168
  1263
** and the probability of hitting the same cookie value is only
dvander@2168
  1264
** 1 chance in 2^32.  So we're safe enough.
dvander@2168
  1265
*/
dvander@2168
  1266
void sqlite3ChangeCookie(sqlite3 *db, Vdbe *v, int iDb){
dvander@2168
  1267
  sqlite3VdbeAddOp(v, OP_Integer, db->aDb[iDb].pSchema->schema_cookie+1, 0);
dvander@2168
  1268
  sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 0);
dvander@2168
  1269
}
dvander@2168
  1270
dvander@2168
  1271
/*
dvander@2168
  1272
** Measure the number of characters needed to output the given
dvander@2168
  1273
** identifier.  The number returned includes any quotes used
dvander@2168
  1274
** but does not include the null terminator.
dvander@2168
  1275
**
dvander@2168
  1276
** The estimate is conservative.  It might be larger that what is
dvander@2168
  1277
** really needed.
dvander@2168
  1278
*/
dvander@2168
  1279
static int identLength(const char *z){
dvander@2168
  1280
  int n;
dvander@2168
  1281
  for(n=0; *z; n++, z++){
dvander@2168
  1282
    if( *z=='"' ){ n++; }
dvander@2168
  1283
  }
dvander@2168
  1284
  return n + 2;
dvander@2168
  1285
}
dvander@2168
  1286
dvander@2168
  1287
/*
dvander@2168
  1288
** Write an identifier onto the end of the given string.  Add
dvander@2168
  1289
** quote characters as needed.
dvander@2168
  1290
*/
dvander@2168
  1291
static void identPut(char *z, int *pIdx, char *zSignedIdent){
dvander@2168
  1292
  unsigned char *zIdent = (unsigned char*)zSignedIdent;
dvander@2168
  1293
  int i, j, needQuote;
dvander@2168
  1294
  i = *pIdx;
dvander@2168
  1295
  for(j=0; zIdent[j]; j++){
dvander@2168
  1296
    if( !isalnum(zIdent[j]) && zIdent[j]!='_' ) break;
dvander@2168
  1297
  }
dvander@2168
  1298
  needQuote =  zIdent[j]!=0 || isdigit(zIdent[0])
dvander@2168
  1299
                  || sqlite3KeywordCode(zIdent, j)!=TK_ID;
dvander@2168
  1300
  if( needQuote ) z[i++] = '"';
dvander@2168
  1301
  for(j=0; zIdent[j]; j++){
dvander@2168
  1302
    z[i++] = zIdent[j];
dvander@2168
  1303
    if( zIdent[j]=='"' ) z[i++] = '"';
dvander@2168
  1304
  }
dvander@2168
  1305
  if( needQuote ) z[i++] = '"';
dvander@2168
  1306
  z[i] = 0;
dvander@2168
  1307
  *pIdx = i;
dvander@2168
  1308
}
dvander@2168
  1309
dvander@2168
  1310
/*
dvander@2168
  1311
** Generate a CREATE TABLE statement appropriate for the given
dvander@2168
  1312
** table.  Memory to hold the text of the statement is obtained
dvander@2168
  1313
** from sqliteMalloc() and must be freed by the calling function.
dvander@2168
  1314
*/
dvander@2168
  1315
static char *createTableStmt(Table *p, int isTemp){
dvander@2168
  1316
  int i, k, n;
dvander@2168
  1317
  char *zStmt;
dvander@2168
  1318
  char *zSep, *zSep2, *zEnd, *z;
dvander@2168
  1319
  Column *pCol;
dvander@2168
  1320
  n = 0;
dvander@2168
  1321
  for(pCol = p->aCol, i=0; i<p->nCol; i++, pCol++){
dvander@2168
  1322
    n += identLength(pCol->zName);
dvander@2168
  1323
    z = pCol->zType;
dvander@2168
  1324
    if( z ){
dvander@2168
  1325
      n += (strlen(z) + 1);
dvander@2168
  1326
    }
dvander@2168
  1327
  }
dvander@2168
  1328
  n += identLength(p->zName);
dvander@2168
  1329
  if( n<50 ){
dvander@2168
  1330
    zSep = "";
dvander@2168
  1331
    zSep2 = ",";
dvander@2168
  1332
    zEnd = ")";
dvander@2168
  1333
  }else{
dvander@2168
  1334
    zSep = "\n  ";
dvander@2168
  1335
    zSep2 = ",\n  ";
dvander@2168
  1336
    zEnd = "\n)";
dvander@2168
  1337
  }
dvander@2168
  1338
  n += 35 + 6*p->nCol;
dvander@2168
  1339
  zStmt = sqlite3_malloc( n );
dvander@2168
  1340
  if( zStmt==0 ) return 0;
dvander@2168
  1341
  sqlite3_snprintf(n, zStmt,
dvander@2168
  1342
                  !OMIT_TEMPDB&&isTemp ? "CREATE TEMP TABLE ":"CREATE TABLE ");
dvander@2168
  1343
  k = strlen(zStmt);
dvander@2168
  1344
  identPut(zStmt, &k, p->zName);
dvander@2168
  1345
  zStmt[k++] = '(';
dvander@2168
  1346
  for(pCol=p->aCol, i=0; i<p->nCol; i++, pCol++){
dvander@2168
  1347
    sqlite3_snprintf(n-k, &zStmt[k], zSep);
dvander@2168
  1348
    k += strlen(&zStmt[k]);
dvander@2168
  1349
    zSep = zSep2;
dvander@2168
  1350
    identPut(zStmt, &k, pCol->zName);
dvander@2168
  1351
    if( (z = pCol->zType)!=0 ){
dvander@2168
  1352
      zStmt[k++] = ' ';
dvander@2168
  1353
      assert( strlen(z)+k+1<=n );
dvander@2168
  1354
      sqlite3_snprintf(n-k, &zStmt[k], "%s", z);
dvander@2168
  1355
      k += strlen(z);
dvander@2168
  1356
    }
dvander@2168
  1357
  }
dvander@2168
  1358
  sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd);
dvander@2168
  1359
  return zStmt;
dvander@2168
  1360
}
dvander@2168
  1361
dvander@2168
  1362
/*
dvander@2168
  1363
** This routine is called to report the final ")" that terminates
dvander@2168
  1364
** a CREATE TABLE statement.
dvander@2168
  1365
**
dvander@2168
  1366
** The table structure that other action routines have been building
dvander@2168
  1367
** is added to the internal hash tables, assuming no errors have
dvander@2168
  1368
** occurred.
dvander@2168
  1369
**
dvander@2168
  1370
** An entry for the table is made in the master table on disk, unless
dvander@2168
  1371
** this is a temporary table or db->init.busy==1.  When db->init.busy==1
dvander@2168
  1372
** it means we are reading the sqlite_master table because we just
dvander@2168
  1373
** connected to the database or because the sqlite_master table has
dvander@2168
  1374
** recently changed, so the entry for this table already exists in
dvander@2168
  1375
** the sqlite_master table.  We do not want to create it again.
dvander@2168
  1376
**
dvander@2168
  1377
** If the pSelect argument is not NULL, it means that this routine
dvander@2168
  1378
** was called to create a table generated from a 
dvander@2168
  1379
** "CREATE TABLE ... AS SELECT ..." statement.  The column names of
dvander@2168
  1380
** the new table will match the result set of the SELECT.
dvander@2168
  1381
*/
dvander@2168
  1382
void sqlite3EndTable(
dvander@2168
  1383
  Parse *pParse,          /* Parse context */
dvander@2168
  1384
  Token *pCons,           /* The ',' token after the last column defn. */
dvander@2168
  1385
  Token *pEnd,            /* The final ')' token in the CREATE TABLE */
dvander@2168
  1386
  Select *pSelect         /* Select from a "CREATE ... AS SELECT" */
dvander@2168
  1387
){
dvander@2168
  1388
  Table *p;
dvander@2168
  1389
  sqlite3 *db = pParse->db;
dvander@2168
  1390
  int iDb;
dvander@2168
  1391
dvander@2168
  1392
  if( (pEnd==0 && pSelect==0) || pParse->nErr || db->mallocFailed ) {
dvander@2168
  1393
    return;
dvander@2168
  1394
  }
dvander@2168
  1395
  p = pParse->pNewTable;
dvander@2168
  1396
  if( p==0 ) return;
dvander@2168
  1397
dvander@2168
  1398
  assert( !db->init.busy || !pSelect );
dvander@2168
  1399
dvander@2168
  1400
  iDb = sqlite3SchemaToIndex(db, p->pSchema);
dvander@2168
  1401
dvander@2168
  1402
#ifndef SQLITE_OMIT_CHECK
dvander@2168
  1403
  /* Resolve names in all CHECK constraint expressions.
dvander@2168
  1404
  */
dvander@2168
  1405
  if( p->pCheck ){
dvander@2168
  1406
    SrcList sSrc;                   /* Fake SrcList for pParse->pNewTable */
dvander@2168
  1407
    NameContext sNC;                /* Name context for pParse->pNewTable */
dvander@2168
  1408
dvander@2168
  1409
    memset(&sNC, 0, sizeof(sNC));
dvander@2168
  1410
    memset(&sSrc, 0, sizeof(sSrc));
dvander@2168
  1411
    sSrc.nSrc = 1;
dvander@2168
  1412
    sSrc.a[0].zName = p->zName;
dvander@2168
  1413
    sSrc.a[0].pTab = p;
dvander@2168
  1414
    sSrc.a[0].iCursor = -1;
dvander@2168
  1415
    sNC.pParse = pParse;
dvander@2168
  1416
    sNC.pSrcList = &sSrc;
dvander@2168
  1417
    sNC.isCheck = 1;
dvander@2168
  1418
    if( sqlite3ExprResolveNames(&sNC, p->pCheck) ){
dvander@2168
  1419
      return;
dvander@2168
  1420
    }
dvander@2168
  1421
  }
dvander@2168
  1422
#endif /* !defined(SQLITE_OMIT_CHECK) */
dvander@2168
  1423
dvander@2168
  1424
  /* If the db->init.busy is 1 it means we are reading the SQL off the
dvander@2168
  1425
  ** "sqlite_master" or "sqlite_temp_master" table on the disk.
dvander@2168
  1426
  ** So do not write to the disk again.  Extract the root page number
dvander@2168
  1427
  ** for the table from the db->init.newTnum field.  (The page number
dvander@2168
  1428
  ** should have been put there by the sqliteOpenCb routine.)
dvander@2168
  1429
  */
dvander@2168
  1430
  if( db->init.busy ){
dvander@2168
  1431
    p->tnum = db->init.newTnum;
dvander@2168
  1432
  }
dvander@2168
  1433
dvander@2168
  1434
  /* If not initializing, then create a record for the new table
dvander@2168
  1435
  ** in the SQLITE_MASTER table of the database.  The record number
dvander@2168
  1436
  ** for the new table entry should already be on the stack.
dvander@2168
  1437
  **
dvander@2168
  1438
  ** If this is a TEMPORARY table, write the entry into the auxiliary
dvander@2168
  1439
  ** file instead of into the main database file.
dvander@2168
  1440
  */
dvander@2168
  1441
  if( !db->init.busy ){
dvander@2168
  1442
    int n;
dvander@2168
  1443
    Vdbe *v;
dvander@2168
  1444
    char *zType;    /* "view" or "table" */
dvander@2168
  1445
    char *zType2;   /* "VIEW" or "TABLE" */
dvander@2168
  1446
    char *zStmt;    /* Text of the CREATE TABLE or CREATE VIEW statement */
dvander@2168
  1447
dvander@2168
  1448
    v = sqlite3GetVdbe(pParse);
dvander@2168
  1449
    if( v==0 ) return;
dvander@2168
  1450
dvander@2168
  1451
    sqlite3VdbeAddOp(v, OP_Close, 0, 0);
dvander@2168
  1452
dvander@2168
  1453
    /* Create the rootpage for the new table and push it onto the stack.
dvander@2168
  1454
    ** A view has no rootpage, so just push a zero onto the stack for
dvander@2168
  1455
    ** views.  Initialize zType at the same time.
dvander@2168
  1456
    */
dvander@2168
  1457
    if( p->pSelect==0 ){
dvander@2168
  1458
      /* A regular table */
dvander@2168
  1459
      zType = "table";
dvander@2168
  1460
      zType2 = "TABLE";
dvander@2168
  1461
#ifndef SQLITE_OMIT_VIEW
dvander@2168
  1462
    }else{
dvander@2168
  1463
      /* A view */
dvander@2168
  1464
      zType = "view";
dvander@2168
  1465
      zType2 = "VIEW";
dvander@2168
  1466
#endif
dvander@2168
  1467
    }
dvander@2168
  1468
dvander@2168
  1469
    /* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT
dvander@2168
  1470
    ** statement to populate the new table. The root-page number for the
dvander@2168
  1471
    ** new table is on the top of the vdbe stack.
dvander@2168
  1472
    **
dvander@2168
  1473
    ** Once the SELECT has been coded by sqlite3Select(), it is in a
dvander@2168
  1474
    ** suitable state to query for the column names and types to be used
dvander@2168
  1475
    ** by the new table.
dvander@2168
  1476
    **
dvander@2168
  1477
    ** A shared-cache write-lock is not required to write to the new table,
dvander@2168
  1478
    ** as a schema-lock must have already been obtained to create it. Since
dvander@2168
  1479
    ** a schema-lock excludes all other database users, the write-lock would
dvander@2168
  1480
    ** be redundant.
dvander@2168
  1481
    */
dvander@2168
  1482
    if( pSelect ){
dvander@2168
  1483
      Table *pSelTab;
dvander@2168
  1484
      sqlite3VdbeAddOp(v, OP_Dup, 0, 0);
dvander@2168
  1485
      sqlite3VdbeAddOp(v, OP_Integer, iDb, 0);
dvander@2168
  1486
      sqlite3VdbeAddOp(v, OP_OpenWrite, 1, 0);
dvander@2168
  1487
      pParse->nTab = 2;
dvander@2168
  1488
      sqlite3Select(pParse, pSelect, SRT_Table, 1, 0, 0, 0, 0);
dvander@2168
  1489
      sqlite3VdbeAddOp(v, OP_Close, 1, 0);
dvander@2168
  1490
      if( pParse->nErr==0 ){
dvander@2168
  1491
        pSelTab = sqlite3ResultSetOfSelect(pParse, 0, pSelect);
dvander@2168
  1492
        if( pSelTab==0 ) return;
dvander@2168
  1493
        assert( p->aCol==0 );
dvander@2168
  1494
        p->nCol = pSelTab->nCol;
dvander@2168
  1495
        p->aCol = pSelTab->aCol;
dvander@2168
  1496
        pSelTab->nCol = 0;
dvander@2168
  1497
        pSelTab->aCol = 0;
dvander@2168
  1498
        sqlite3DeleteTable(pSelTab);
dvander@2168
  1499
      }
dvander@2168
  1500
    }
dvander@2168
  1501
dvander@2168
  1502
    /* Compute the complete text of the CREATE statement */
dvander@2168
  1503
    if( pSelect ){
dvander@2168
  1504
      zStmt = createTableStmt(p, p->pSchema==db->aDb[1].pSchema);
dvander@2168
  1505
    }else{
dvander@2168
  1506
      n = pEnd->z - pParse->sNameToken.z + 1;
dvander@2168
  1507
      zStmt = sqlite3MPrintf(db, 
dvander@2168
  1508
          "CREATE %s %.*s", zType2, n, pParse->sNameToken.z
dvander@2168
  1509
      );
dvander@2168
  1510
    }
dvander@2168
  1511
dvander@2168
  1512
    /* A slot for the record has already been allocated in the 
dvander@2168
  1513
    ** SQLITE_MASTER table.  We just need to update that slot with all
dvander@2168
  1514
    ** the information we've collected.  The rowid for the preallocated
dvander@2168
  1515
    ** slot is the 2nd item on the stack.  The top of the stack is the
dvander@2168
  1516
    ** root page for the new table (or a 0 if this is a view).
dvander@2168
  1517
    */
dvander@2168
  1518
    sqlite3NestedParse(pParse,
dvander@2168
  1519
      "UPDATE %Q.%s "
dvander@2168
  1520
         "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#0, sql=%Q "
dvander@2168
  1521
       "WHERE rowid=#1",
dvander@2168
  1522
      db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
dvander@2168
  1523
      zType,
dvander@2168
  1524
      p->zName,
dvander@2168
  1525
      p->zName,
dvander@2168
  1526
      zStmt
dvander@2168
  1527
    );
dvander@2168
  1528
    sqlite3_free(zStmt);
dvander@2168
  1529
    sqlite3ChangeCookie(db, v, iDb);
dvander@2168
  1530
dvander@2168
  1531
#ifndef SQLITE_OMIT_AUTOINCREMENT
dvander@2168
  1532
    /* Check to see if we need to create an sqlite_sequence table for
dvander@2168
  1533
    ** keeping track of autoincrement keys.
dvander@2168
  1534
    */
dvander@2168
  1535
    if( p->autoInc ){
dvander@2168
  1536
      Db *pDb = &db->aDb[iDb];
dvander@2168
  1537
      if( pDb->pSchema->pSeqTab==0 ){
dvander@2168
  1538
        sqlite3NestedParse(pParse,
dvander@2168
  1539
          "CREATE TABLE %Q.sqlite_sequence(name,seq)",
dvander@2168
  1540
          pDb->zName
dvander@2168
  1541
        );
dvander@2168
  1542
      }
dvander@2168
  1543
    }
dvander@2168
  1544
#endif
dvander@2168
  1545
dvander@2168
  1546
    /* Reparse everything to update our internal data structures */
dvander@2168
  1547
    sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0,
dvander@2168
  1548
        sqlite3MPrintf(db, "tbl_name='%q'",p->zName), P3_DYNAMIC);
dvander@2168
  1549
  }
dvander@2168
  1550
dvander@2168
  1551
dvander@2168
  1552
  /* Add the table to the in-memory representation of the database.
dvander@2168
  1553
  */
dvander@2168
  1554
  if( db->init.busy && pParse->nErr==0 ){
dvander@2168
  1555
    Table *pOld;
dvander@2168
  1556
    FKey *pFKey; 
dvander@2168
  1557
    Schema *pSchema = p->pSchema;
dvander@2168
  1558
    pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName, strlen(p->zName)+1,p);
dvander@2168
  1559
    if( pOld ){
dvander@2168
  1560
      assert( p==pOld );  /* Malloc must have failed inside HashInsert() */
dvander@2168
  1561
      db->mallocFailed = 1;
dvander@2168
  1562
      return;
dvander@2168
  1563
    }
dvander@2168
  1564
#ifndef SQLITE_OMIT_FOREIGN_KEY
dvander@2168
  1565
    for(pFKey=p->pFKey; pFKey; pFKey=pFKey->pNextFrom){
dvander@2168
  1566
      void *data;
dvander@2168
  1567
      int nTo = strlen(pFKey->zTo) + 1;
dvander@2168
  1568
      pFKey->pNextTo = sqlite3HashFind(&pSchema->aFKey, pFKey->zTo, nTo);
dvander@2168
  1569
      data = sqlite3HashInsert(&pSchema->aFKey, pFKey->zTo, nTo, pFKey);
dvander@2168
  1570
      if( data==(void *)pFKey ){
dvander@2168
  1571
        db->mallocFailed = 1;
dvander@2168
  1572
      }
dvander@2168
  1573
    }
dvander@2168
  1574
#endif
dvander@2168
  1575
    pParse->pNewTable = 0;
dvander@2168
  1576
    db->nTable++;
dvander@2168
  1577
    db->flags |= SQLITE_InternChanges;
dvander@2168
  1578
dvander@2168
  1579
#ifndef SQLITE_OMIT_ALTERTABLE
dvander@2168
  1580
    if( !p->pSelect ){
dvander@2168
  1581
      const char *zName = (const char *)pParse->sNameToken.z;
dvander@2168
  1582
      int nName;
dvander@2168
  1583
      assert( !pSelect && pCons && pEnd );
dvander@2168
  1584
      if( pCons->z==0 ){
dvander@2168
  1585
        pCons = pEnd;
dvander@2168
  1586
      }
dvander@2168
  1587
      nName = (const char *)pCons->z - zName;
dvander@2168
  1588
      p->addColOffset = 13 + sqlite3Utf8CharLen(zName, nName);
dvander@2168
  1589
    }
dvander@2168
  1590
#endif
dvander@2168
  1591
  }
dvander@2168
  1592
}
dvander@2168
  1593
dvander@2168
  1594
#ifndef SQLITE_OMIT_VIEW
dvander@2168
  1595
/*
dvander@2168
  1596
** The parser calls this routine in order to create a new VIEW
dvander@2168
  1597
*/
dvander@2168
  1598
void sqlite3CreateView(
dvander@2168
  1599
  Parse *pParse,     /* The parsing context */
dvander@2168
  1600
  Token *pBegin,     /* The CREATE token that begins the statement */
dvander@2168
  1601
  Token *pName1,     /* The token that holds the name of the view */
dvander@2168
  1602
  Token *pName2,     /* The token that holds the name of the view */
dvander@2168
  1603
  Select *pSelect,   /* A SELECT statement that will become the new view */
dvander@2168
  1604
  int isTemp,        /* TRUE for a TEMPORARY view */
dvander@2168
  1605
  int noErr          /* Suppress error messages if VIEW already exists */
dvander@2168
  1606
){
dvander@2168
  1607
  Table *p;
dvander@2168
  1608
  int n;
dvander@2168
  1609
  const unsigned char *z;
dvander@2168
  1610
  Token sEnd;
dvander@2168
  1611
  DbFixer sFix;
dvander@2168
  1612
  Token *pName;
dvander@2168
  1613
  int iDb;
dvander@2168
  1614
  sqlite3 *db = pParse->db;
dvander@2168
  1615
dvander@2168
  1616
  if( pParse->nVar>0 ){
dvander@2168
  1617
    sqlite3ErrorMsg(pParse, "parameters are not allowed in views");
dvander@2168
  1618
    sqlite3SelectDelete(pSelect);
dvander@2168
  1619
    return;
dvander@2168
  1620
  }
dvander@2168
  1621
  sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr);
dvander@2168
  1622
  p = pParse->pNewTable;
dvander@2168
  1623
  if( p==0 || pParse->nErr ){
dvander@2168
  1624
    sqlite3SelectDelete(pSelect);
dvander@2168
  1625
    return;
dvander@2168
  1626
  }
dvander@2168
  1627
  sqlite3TwoPartName(pParse, pName1, pName2, &pName);
dvander@2168
  1628
  iDb = sqlite3SchemaToIndex(db, p->pSchema);
dvander@2168
  1629
  if( sqlite3FixInit(&sFix, pParse, iDb, "view", pName)
dvander@2168
  1630
    && sqlite3FixSelect(&sFix, pSelect)
dvander@2168
  1631
  ){
dvander@2168
  1632
    sqlite3SelectDelete(pSelect);
dvander@2168
  1633
    return;
dvander@2168
  1634
  }
dvander@2168
  1635
dvander@2168
  1636
  /* Make a copy of the entire SELECT statement that defines the view.
dvander@2168
  1637
  ** This will force all the Expr.token.z values to be dynamically
dvander@2168
  1638
  ** allocated rather than point to the input string - which means that
dvander@2168
  1639
  ** they will persist after the current sqlite3_exec() call returns.
dvander@2168
  1640
  */
dvander@2168
  1641
  p->pSelect = sqlite3SelectDup(db, pSelect);
dvander@2168
  1642
  sqlite3SelectDelete(pSelect);
dvander@2168
  1643
  if( db->mallocFailed ){
dvander@2168
  1644
    return;
dvander@2168
  1645
  }
dvander@2168
  1646
  if( !db->init.busy ){
dvander@2168
  1647
    sqlite3ViewGetColumnNames(pParse, p);
dvander@2168
  1648
  }
dvander@2168
  1649
dvander@2168
  1650
  /* Locate the end of the CREATE VIEW statement.  Make sEnd point to
dvander@2168
  1651
  ** the end.
dvander@2168
  1652
  */
dvander@2168
  1653
  sEnd = pParse->sLastToken;
dvander@2168
  1654
  if( sEnd.z[0]!=0 && sEnd.z[0]!=';' ){
dvander@2168
  1655
    sEnd.z += sEnd.n;
dvander@2168
  1656
  }
dvander@2168
  1657
  sEnd.n = 0;
dvander@2168
  1658
  n = sEnd.z - pBegin->z;
dvander@2168
  1659
  z = (const unsigned char*)pBegin->z;
dvander@2168
  1660
  while( n>0 && (z[n-1]==';' || isspace(z[n-1])) ){ n--; }
dvander@2168
  1661
  sEnd.z = &z[n-1];
dvander@2168
  1662
  sEnd.n = 1;
dvander@2168
  1663
dvander@2168
  1664
  /* Use sqlite3EndTable() to add the view to the SQLITE_MASTER table */
dvander@2168
  1665
  sqlite3EndTable(pParse, 0, &sEnd, 0);
dvander@2168
  1666
  return;
dvander@2168
  1667
}
dvander@2168
  1668
#endif /* SQLITE_OMIT_VIEW */
dvander@2168
  1669
dvander@2168
  1670
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
dvander@2168
  1671
/*
dvander@2168
  1672
** The Table structure pTable is really a VIEW.  Fill in the names of
dvander@2168
  1673
** the columns of the view in the pTable structure.  Return the number
dvander@2168
  1674
** of errors.  If an error is seen leave an error message in pParse->zErrMsg.
dvander@2168
  1675
*/
dvander@2168
  1676
int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
dvander@2168
  1677
  Table *pSelTab;   /* A fake table from which we get the result set */
dvander@2168
  1678
  Select *pSel;     /* Copy of the SELECT that implements the view */
dvander@2168
  1679
  int nErr = 0;     /* Number of errors encountered */
dvander@2168
  1680
  int n;            /* Temporarily holds the number of cursors assigned */
dvander@2168
  1681
  sqlite3 *db = pParse->db;  /* Database connection for malloc errors */
dvander@2168
  1682
dvander@2168
  1683
  assert( pTable );
dvander@2168
  1684
dvander@2168
  1685
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@2168
  1686
  if( sqlite3VtabCallConnect(pParse, pTable) ){
dvander@2168
  1687
    return SQLITE_ERROR;
dvander@2168
  1688
  }
dvander@2168
  1689
  if( IsVirtual(pTable) ) return 0;
dvander@2168
  1690
#endif
dvander@2168
  1691
dvander@2168
  1692
#ifndef SQLITE_OMIT_VIEW
dvander@2168
  1693
  /* A positive nCol means the columns names for this view are
dvander@2168
  1694
  ** already known.
dvander@2168
  1695
  */
dvander@2168
  1696
  if( pTable->nCol>0 ) return 0;
dvander@2168
  1697
dvander@2168
  1698
  /* A negative nCol is a special marker meaning that we are currently
dvander@2168
  1699
  ** trying to compute the column names.  If we enter this routine with
dvander@2168
  1700
  ** a negative nCol, it means two or more views form a loop, like this:
dvander@2168
  1701
  **
dvander@2168
  1702
  **     CREATE VIEW one AS SELECT * FROM two;
dvander@2168
  1703
  **     CREATE VIEW two AS SELECT * FROM one;
dvander@2168
  1704
  **
dvander@2168
  1705
  ** Actually, this error is caught previously and so the following test
dvander@2168
  1706
  ** should always fail.  But we will leave it in place just to be safe.
dvander@2168
  1707
  */
dvander@2168
  1708
  if( pTable->nCol<0 ){
dvander@2168
  1709
    sqlite3ErrorMsg(pParse, "view %s is circularly defined", pTable->zName);
dvander@2168
  1710
    return 1;
dvander@2168
  1711
  }
dvander@2168
  1712
  assert( pTable->nCol>=0 );
dvander@2168
  1713
dvander@2168
  1714
  /* If we get this far, it means we need to compute the table names.
dvander@2168
  1715
  ** Note that the call to sqlite3ResultSetOfSelect() will expand any
dvander@2168
  1716
  ** "*" elements in the results set of the view and will assign cursors
dvander@2168
  1717
  ** to the elements of the FROM clause.  But we do not want these changes
dvander@2168
  1718
  ** to be permanent.  So the computation is done on a copy of the SELECT
dvander@2168
  1719
  ** statement that defines the view.
dvander@2168
  1720
  */
dvander@2168
  1721
  assert( pTable->pSelect );
dvander@2168
  1722
  pSel = sqlite3SelectDup(db, pTable->pSelect);
dvander@2168
  1723
  if( pSel ){
dvander@2168
  1724
    n = pParse->nTab;
dvander@2168
  1725
    sqlite3SrcListAssignCursors(pParse, pSel->pSrc);
dvander@2168
  1726
    pTable->nCol = -1;
dvander@2168
  1727
    pSelTab = sqlite3ResultSetOfSelect(pParse, 0, pSel);
dvander@2168
  1728
    pParse->nTab = n;
dvander@2168
  1729
    if( pSelTab ){
dvander@2168
  1730
      assert( pTable->aCol==0 );
dvander@2168
  1731
      pTable->nCol = pSelTab->nCol;
dvander@2168
  1732
      pTable->aCol = pSelTab->aCol;
dvander@2168
  1733
      pSelTab->nCol = 0;
dvander@2168
  1734
      pSelTab->aCol = 0;
dvander@2168
  1735
      sqlite3DeleteTable(pSelTab);
dvander@2168
  1736
      pTable->pSchema->flags |= DB_UnresetViews;
dvander@2168
  1737
    }else{
dvander@2168
  1738
      pTable->nCol = 0;
dvander@2168
  1739
      nErr++;
dvander@2168
  1740
    }
dvander@2168
  1741
    sqlite3SelectDelete(pSel);
dvander@2168
  1742
  } else {
dvander@2168
  1743
    nErr++;
dvander@2168
  1744
  }
dvander@2168
  1745
#endif /* SQLITE_OMIT_VIEW */
dvander@2168
  1746
  return nErr;  
dvander@2168
  1747
}
dvander@2168
  1748
#endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */
dvander@2168
  1749
dvander@2168
  1750
#ifndef SQLITE_OMIT_VIEW
dvander@2168
  1751
/*
dvander@2168
  1752
** Clear the column names from every VIEW in database idx.
dvander@2168
  1753
*/
dvander@2168
  1754
static void sqliteViewResetAll(sqlite3 *db, int idx){
dvander@2168
  1755
  HashElem *i;
dvander@2168
  1756
  if( !DbHasProperty(db, idx, DB_UnresetViews) ) return;
dvander@2168
  1757
  for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){
dvander@2168
  1758
    Table *pTab = sqliteHashData(i);
dvander@2168
  1759
    if( pTab->pSelect ){
dvander@2168
  1760
      sqliteResetColumnNames(pTab);
dvander@2168
  1761
    }
dvander@2168
  1762
  }
dvander@2168
  1763
  DbClearProperty(db, idx, DB_UnresetViews);
dvander@2168
  1764
}
dvander@2168
  1765
#else
dvander@2168
  1766
# define sqliteViewResetAll(A,B)
dvander@2168
  1767
#endif /* SQLITE_OMIT_VIEW */
dvander@2168
  1768
dvander@2168
  1769
/*
dvander@2168
  1770
** This function is called by the VDBE to adjust the internal schema
dvander@2168
  1771
** used by SQLite when the btree layer moves a table root page. The
dvander@2168
  1772
** root-page of a table or index in database iDb has changed from iFrom
dvander@2168
  1773
** to iTo.
dvander@2168
  1774
**
dvander@2168
  1775
** Ticket #1728:  The symbol table might still contain information
dvander@2168
  1776
** on tables and/or indices that are the process of being deleted.
dvander@2168
  1777
** If you are unlucky, one of those deleted indices or tables might
dvander@2168
  1778
** have the same rootpage number as the real table or index that is
dvander@2168
  1779
** being moved.  So we cannot stop searching after the first match 
dvander@2168
  1780
** because the first match might be for one of the deleted indices
dvander@2168
  1781
** or tables and not the table/index that is actually being moved.
dvander@2168
  1782
** We must continue looping until all tables and indices with
dvander@2168
  1783
** rootpage==iFrom have been converted to have a rootpage of iTo
dvander@2168
  1784
** in order to be certain that we got the right one.
dvander@2168
  1785
*/
dvander@2168
  1786
#ifndef SQLITE_OMIT_AUTOVACUUM
dvander@2168
  1787
void sqlite3RootPageMoved(Db *pDb, int iFrom, int iTo){
dvander@2168
  1788
  HashElem *pElem;
dvander@2168
  1789
  Hash *pHash;
dvander@2168
  1790
dvander@2168
  1791
  pHash = &pDb->pSchema->tblHash;
dvander@2168
  1792
  for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){
dvander@2168
  1793
    Table *pTab = sqliteHashData(pElem);
dvander@2168
  1794
    if( pTab->tnum==iFrom ){
dvander@2168
  1795
      pTab->tnum = iTo;
dvander@2168
  1796
    }
dvander@2168
  1797
  }
dvander@2168
  1798
  pHash = &pDb->pSchema->idxHash;
dvander@2168
  1799
  for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){
dvander@2168
  1800
    Index *pIdx = sqliteHashData(pElem);
dvander@2168
  1801
    if( pIdx->tnum==iFrom ){
dvander@2168
  1802
      pIdx->tnum = iTo;
dvander@2168
  1803
    }
dvander@2168
  1804
  }
dvander@2168
  1805
}
dvander@2168
  1806
#endif
dvander@2168
  1807
dvander@2168
  1808
/*
dvander@2168
  1809
** Write code to erase the table with root-page iTable from database iDb.
dvander@2168
  1810
** Also write code to modify the sqlite_master table and internal schema
dvander@2168
  1811
** if a root-page of another table is moved by the btree-layer whilst
dvander@2168
  1812
** erasing iTable (this can happen with an auto-vacuum database).
dvander@2168
  1813
*/ 
dvander@2168
  1814
static void destroyRootPage(Parse *pParse, int iTable, int iDb){
dvander@2168
  1815
  Vdbe *v = sqlite3GetVdbe(pParse);
dvander@2168
  1816
  sqlite3VdbeAddOp(v, OP_Destroy, iTable, iDb);
dvander@2168
  1817
#ifndef SQLITE_OMIT_AUTOVACUUM
dvander@2168
  1818
  /* OP_Destroy pushes an integer onto the stack. If this integer
dvander@2168
  1819
  ** is non-zero, then it is the root page number of a table moved to
dvander@2168
  1820
  ** location iTable. The following code modifies the sqlite_master table to
dvander@2168
  1821
  ** reflect this.
dvander@2168
  1822
  **
dvander@2168
  1823
  ** The "#0" in the SQL is a special constant that means whatever value
dvander@2168
  1824
  ** is on the top of the stack.  See sqlite3RegisterExpr().
dvander@2168
  1825
  */
dvander@2168
  1826
  sqlite3NestedParse(pParse, 
dvander@2168
  1827
     "UPDATE %Q.%s SET rootpage=%d WHERE #0 AND rootpage=#0",
dvander@2168
  1828
     pParse->db->aDb[iDb].zName, SCHEMA_TABLE(iDb), iTable);
dvander@2168
  1829
#endif
dvander@2168
  1830
}
dvander@2168
  1831
dvander@2168
  1832
/*
dvander@2168
  1833
** Write VDBE code to erase table pTab and all associated indices on disk.
dvander@2168
  1834
** Code to update the sqlite_master tables and internal schema definitions
dvander@2168
  1835
** in case a root-page belonging to another table is moved by the btree layer
dvander@2168
  1836
** is also added (this can happen with an auto-vacuum database).
dvander@2168
  1837
*/
dvander@2168
  1838
static void destroyTable(Parse *pParse, Table *pTab){
dvander@2168
  1839
#ifdef SQLITE_OMIT_AUTOVACUUM
dvander@2168
  1840
  Index *pIdx;
dvander@2168
  1841
  int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
dvander@2168
  1842
  destroyRootPage(pParse, pTab->tnum, iDb);
dvander@2168
  1843
  for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
dvander@2168
  1844
    destroyRootPage(pParse, pIdx->tnum, iDb);
dvander@2168
  1845
  }
dvander@2168
  1846
#else
dvander@2168
  1847
  /* If the database may be auto-vacuum capable (if SQLITE_OMIT_AUTOVACUUM
dvander@2168
  1848
  ** is not defined), then it is important to call OP_Destroy on the
dvander@2168
  1849
  ** table and index root-pages in order, starting with the numerically 
dvander@2168
  1850
  ** largest root-page number. This guarantees that none of the root-pages
dvander@2168
  1851
  ** to be destroyed is relocated by an earlier OP_Destroy. i.e. if the
dvander@2168
  1852
  ** following were coded:
dvander@2168
  1853
  **
dvander@2168
  1854
  ** OP_Destroy 4 0
dvander@2168
  1855
  ** ...
dvander@2168
  1856
  ** OP_Destroy 5 0
dvander@2168
  1857
  **
dvander@2168
  1858
  ** and root page 5 happened to be the largest root-page number in the
dvander@2168
  1859
  ** database, then root page 5 would be moved to page 4 by the 
dvander@2168
  1860
  ** "OP_Destroy 4 0" opcode. The subsequent "OP_Destroy 5 0" would hit
dvander@2168
  1861
  ** a free-list page.
dvander@2168
  1862
  */
dvander@2168
  1863
  int iTab = pTab->tnum;
dvander@2168
  1864
  int iDestroyed = 0;
dvander@2168
  1865
dvander@2168
  1866
  while( 1 ){
dvander@2168
  1867
    Index *pIdx;
dvander@2168
  1868
    int iLargest = 0;
dvander@2168
  1869
dvander@2168
  1870
    if( iDestroyed==0 || iTab<iDestroyed ){
dvander@2168
  1871
      iLargest = iTab;
dvander@2168
  1872
    }
dvander@2168
  1873
    for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
dvander@2168
  1874
      int iIdx = pIdx->tnum;
dvander@2168
  1875
      assert( pIdx->pSchema==pTab->pSchema );
dvander@2168
  1876
      if( (iDestroyed==0 || (iIdx<iDestroyed)) && iIdx>iLargest ){
dvander@2168
  1877
        iLargest = iIdx;
dvander@2168
  1878
      }
dvander@2168
  1879
    }
dvander@2168
  1880
    if( iLargest==0 ){
dvander@2168
  1881
      return;
dvander@2168
  1882
    }else{
dvander@2168
  1883
      int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
dvander@2168
  1884
      destroyRootPage(pParse, iLargest, iDb);
dvander@2168
  1885
      iDestroyed = iLargest;
dvander@2168
  1886
    }
dvander@2168
  1887
  }
dvander@2168
  1888
#endif
dvander@2168
  1889
}
dvander@2168
  1890
dvander@2168
  1891
/*
dvander@2168
  1892
** This routine is called to do the work of a DROP TABLE statement.
dvander@2168
  1893
** pName is the name of the table to be dropped.
dvander@2168
  1894
*/
dvander@2168
  1895
void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){
dvander@2168
  1896
  Table *pTab;
dvander@2168
  1897
  Vdbe *v;
dvander@2168
  1898
  sqlite3 *db = pParse->db;
dvander@2168
  1899
  int iDb;
dvander@2168
  1900
dvander@2168
  1901
  if( pParse->nErr || db->mallocFailed ){
dvander@2168
  1902
    goto exit_drop_table;
dvander@2168
  1903
  }
dvander@2168
  1904
  assert( pName->nSrc==1 );
dvander@2168
  1905
  pTab = sqlite3LocateTable(pParse, pName->a[0].zName, pName->a[0].zDatabase);
dvander@2168
  1906
dvander@2168
  1907
  if( pTab==0 ){
dvander@2168
  1908
    if( noErr ){
dvander@2168
  1909
      sqlite3ErrorClear(pParse);
dvander@2168
  1910
    }
dvander@2168
  1911
    goto exit_drop_table;
dvander@2168
  1912
  }
dvander@2168
  1913
  iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
dvander@2168
  1914
  assert( iDb>=0 && iDb<db->nDb );
dvander@2168
  1915
#ifndef SQLITE_OMIT_AUTHORIZATION
dvander@2168
  1916
  {
dvander@2168
  1917
    int code;
dvander@2168
  1918
    const char *zTab = SCHEMA_TABLE(iDb);
dvander@2168
  1919
    const char *zDb = db->aDb[iDb].zName;
dvander@2168
  1920
    const char *zArg2 = 0;
dvander@2168
  1921
    if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){
dvander@2168
  1922
      goto exit_drop_table;
dvander@2168
  1923
    }
dvander@2168
  1924
    if( isView ){
dvander@2168
  1925
      if( !OMIT_TEMPDB && iDb==1 ){
dvander@2168
  1926
        code = SQLITE_DROP_TEMP_VIEW;
dvander@2168
  1927
      }else{
dvander@2168
  1928
        code = SQLITE_DROP_VIEW;
dvander@2168
  1929
      }
dvander@2168
  1930
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@2168
  1931
    }else if( IsVirtual(pTab) ){
dvander@2168
  1932
      if( sqlite3ViewGetColumnNames(pParse, pTab) ){
dvander@2168
  1933
        goto exit_drop_table;
dvander@2168
  1934
      }
dvander@2168
  1935
      code = SQLITE_DROP_VTABLE;
dvander@2168
  1936
      zArg2 = pTab->pMod->zName;
dvander@2168
  1937
#endif
dvander@2168
  1938
    }else{
dvander@2168
  1939
      if( !OMIT_TEMPDB && iDb==1 ){
dvander@2168
  1940
        code = SQLITE_DROP_TEMP_TABLE;
dvander@2168
  1941
      }else{
dvander@2168
  1942
        code = SQLITE_DROP_TABLE;
dvander@2168
  1943
      }
dvander@2168
  1944
    }
dvander@2168
  1945
    if( sqlite3AuthCheck(pParse, code, pTab->zName, zArg2, zDb) ){
dvander@2168
  1946
      goto exit_drop_table;
dvander@2168
  1947
    }
dvander@2168
  1948
    if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){
dvander@2168
  1949
      goto exit_drop_table;
dvander@2168
  1950
    }
dvander@2168
  1951
  }
dvander@2168
  1952
#endif
dvander@2168
  1953
  if( pTab->readOnly || pTab==db->aDb[iDb].pSchema->pSeqTab ){
dvander@2168
  1954
    sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName);
dvander@2168
  1955
    goto exit_drop_table;
dvander@2168
  1956
  }
dvander@2168
  1957
dvander@2168
  1958
#ifndef SQLITE_OMIT_VIEW
dvander@2168
  1959
  /* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used
dvander@2168
  1960
  ** on a table.
dvander@2168
  1961
  */
dvander@2168
  1962
  if( isView && pTab->pSelect==0 ){
dvander@2168
  1963
    sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName);
dvander@2168
  1964
    goto exit_drop_table;
dvander@2168
  1965
  }
dvander@2168
  1966
  if( !isView && pTab->pSelect ){
dvander@2168
  1967
    sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName);
dvander@2168
  1968
    goto exit_drop_table;
dvander@2168
  1969
  }
dvander@2168
  1970
#endif
dvander@2168
  1971
dvander@2168
  1972
  /* Generate code to remove the table from the master table
dvander@2168
  1973
  ** on disk.
dvander@2168
  1974
  */
dvander@2168
  1975
  v = sqlite3GetVdbe(pParse);
dvander@2168
  1976
  if( v ){
dvander@2168
  1977
    Trigger *pTrigger;
dvander@2168
  1978
    Db *pDb = &db->aDb[iDb];
dvander@2168
  1979
    sqlite3BeginWriteOperation(pParse, 0, iDb);
dvander@2168
  1980
dvander@2168
  1981
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@2168
  1982
    if( IsVirtual(pTab) ){
dvander@2168
  1983
      Vdbe *v = sqlite3GetVdbe(pParse);
dvander@2168
  1984
      if( v ){
dvander@2168
  1985
        sqlite3VdbeAddOp(v, OP_VBegin, 0, 0);
dvander@2168
  1986
      }
dvander@2168
  1987
    }
dvander@2168
  1988
#endif
dvander@2168
  1989
dvander@2168
  1990
    /* Drop all triggers associated with the table being dropped. Code
dvander@2168
  1991
    ** is generated to remove entries from sqlite_master and/or
dvander@2168
  1992
    ** sqlite_temp_master if required.
dvander@2168
  1993
    */
dvander@2168
  1994
    pTrigger = pTab->pTrigger;
dvander@2168
  1995
    while( pTrigger ){
dvander@2168
  1996
      assert( pTrigger->pSchema==pTab->pSchema || 
dvander@2168
  1997
          pTrigger->pSchema==db->aDb[1].pSchema );
dvander@2168
  1998
      sqlite3DropTriggerPtr(pParse, pTrigger);
dvander@2168
  1999
      pTrigger = pTrigger->pNext;
dvander@2168
  2000
    }
dvander@2168
  2001
dvander@2168
  2002
#ifndef SQLITE_OMIT_AUTOINCREMENT
dvander@2168
  2003
    /* Remove any entries of the sqlite_sequence table associated with
dvander@2168
  2004
    ** the table being dropped. This is done before the table is dropped
dvander@2168
  2005
    ** at the btree level, in case the sqlite_sequence table needs to
dvander@2168
  2006
    ** move as a result of the drop (can happen in auto-vacuum mode).
dvander@2168
  2007
    */
dvander@2168
  2008
    if( pTab->autoInc ){
dvander@2168
  2009
      sqlite3NestedParse(pParse,
dvander@2168
  2010
        "DELETE FROM %s.sqlite_sequence WHERE name=%Q",
dvander@2168
  2011
        pDb->zName, pTab->zName
dvander@2168
  2012
      );
dvander@2168
  2013
    }
dvander@2168
  2014
#endif
dvander@2168
  2015
dvander@2168
  2016
    /* Drop all SQLITE_MASTER table and index entries that refer to the
dvander@2168
  2017
    ** table. The program name loops through the master table and deletes
dvander@2168
  2018
    ** every row that refers to a table of the same name as the one being
dvander@2168
  2019
    ** dropped. Triggers are handled seperately because a trigger can be
dvander@2168
  2020
    ** created in the temp database that refers to a table in another
dvander@2168
  2021
    ** database.
dvander@2168
  2022
    */
dvander@2168
  2023
    sqlite3NestedParse(pParse, 
dvander@2168
  2024
        "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'",
dvander@2168
  2025
        pDb->zName, SCHEMA_TABLE(iDb), pTab->zName);
dvander@2168
  2026
    if( !isView && !IsVirtual(pTab) ){
dvander@2168
  2027
      destroyTable(pParse, pTab);
dvander@2168
  2028
    }
dvander@2168
  2029
dvander@2168
  2030
    /* Remove the table entry from SQLite's internal schema and modify
dvander@2168
  2031
    ** the schema cookie.
dvander@2168
  2032
    */
dvander@2168
  2033
    if( IsVirtual(pTab) ){
dvander@2168
  2034
      sqlite3VdbeOp3(v, OP_VDestroy, iDb, 0, pTab->zName, 0);
dvander@2168
  2035
    }
dvander@2168
  2036
    sqlite3VdbeOp3(v, OP_DropTable, iDb, 0, pTab->zName, 0);
dvander@2168
  2037
    sqlite3ChangeCookie(db, v, iDb);
dvander@2168
  2038
  }
dvander@2168
  2039
  sqliteViewResetAll(db, iDb);
dvander@2168
  2040
dvander@2168
  2041
exit_drop_table:
dvander@2168
  2042
  sqlite3SrcListDelete(pName);
dvander@2168
  2043
}
dvander@2168
  2044
dvander@2168
  2045
/*
dvander@2168
  2046
** This routine is called to create a new foreign key on the table
dvander@2168
  2047
** currently under construction.  pFromCol determines which columns
dvander@2168
  2048
** in the current table point to the foreign key.  If pFromCol==0 then
dvander@2168
  2049
** connect the key to the last column inserted.  pTo is the name of
dvander@2168
  2050
** the table referred to.  pToCol is a list of tables in the other
dvander@2168
  2051
** pTo table that the foreign key points to.  flags contains all
dvander@2168
  2052
** information about the conflict resolution algorithms specified
dvander@2168
  2053
** in the ON DELETE, ON UPDATE and ON INSERT clauses.
dvander@2168
  2054
**
dvander@2168
  2055
** An FKey structure is created and added to the table currently
dvander@2168
  2056
** under construction in the pParse->pNewTable field.  The new FKey
dvander@2168
  2057
** is not linked into db->aFKey at this point - that does not happen
dvander@2168
  2058
** until sqlite3EndTable().
dvander@2168
  2059
**
dvander@2168
  2060
** The foreign key is set for IMMEDIATE processing.  A subsequent call
dvander@2168
  2061
** to sqlite3DeferForeignKey() might change this to DEFERRED.
dvander@2168
  2062
*/
dvander@2168
  2063
void sqlite3CreateForeignKey(
dvander@2168
  2064
  Parse *pParse,       /* Parsing context */
dvander@2168
  2065
  ExprList *pFromCol,  /* Columns in this table that point to other table */
dvander@2168
  2066
  Token *pTo,          /* Name of the other table */
dvander@2168
  2067
  ExprList *pToCol,    /* Columns in the other table */
dvander@2168
  2068
  int flags            /* Conflict resolution algorithms. */
dvander@2168
  2069
){
dvander@2168
  2070
#ifndef SQLITE_OMIT_FOREIGN_KEY
dvander@2168
  2071
  FKey *pFKey = 0;
dvander@2168
  2072
  Table *p = pParse->pNewTable;
dvander@2168
  2073
  int nByte;
dvander@2168
  2074
  int i;
dvander@2168
  2075
  int nCol;
dvander@2168
  2076
  char *z;
dvander@2168
  2077
dvander@2168
  2078
  assert( pTo!=0 );
dvander@2168
  2079
  if( p==0 || pParse->nErr || IN_DECLARE_VTAB ) goto fk_end;
dvander@2168
  2080
  if( pFromCol==0 ){
dvander@2168
  2081
    int iCol = p->nCol-1;
dvander@2168
  2082
    if( iCol<0 ) goto fk_end;
dvander@2168
  2083
    if( pToCol && pToCol->nExpr!=1 ){
dvander@2168
  2084
      sqlite3ErrorMsg(pParse, "foreign key on %s"
dvander@2168
  2085
         " should reference only one column of table %T",
dvander@2168
  2086
         p->aCol[iCol].zName, pTo);
dvander@2168
  2087
      goto fk_end;
dvander@2168
  2088
    }
dvander@2168
  2089
    nCol = 1;
dvander@2168
  2090
  }else if( pToCol && pToCol->nExpr!=pFromCol->nExpr ){
dvander@2168
  2091
    sqlite3ErrorMsg(pParse,
dvander@2168
  2092
        "number of columns in foreign key does not match the number of "
dvander@2168
  2093
        "columns in the referenced table");
dvander@2168
  2094
    goto fk_end;
dvander@2168
  2095
  }else{
dvander@2168
  2096
    nCol = pFromCol->nExpr;
dvander@2168
  2097
  }
dvander@2168
  2098
  nByte = sizeof(*pFKey) + nCol*sizeof(pFKey->aCol[0]) + pTo->n + 1;
dvander@2168
  2099
  if( pToCol ){
dvander@2168
  2100
    for(i=0; i<pToCol->nExpr; i++){
dvander@2168
  2101
      nByte += strlen(pToCol->a[i].zName) + 1;
dvander@2168
  2102
    }
dvander@2168
  2103
  }
dvander@2168
  2104
  pFKey = sqlite3DbMallocZero(pParse->db, nByte );
dvander@2168
  2105
  if( pFKey==0 ){
dvander@2168
  2106
    goto fk_end;
dvander@2168
  2107
  }
dvander@2168
  2108
  pFKey->pFrom = p;
dvander@2168
  2109
  pFKey->pNextFrom = p->pFKey;
dvander@2168
  2110
  z = (char*)&pFKey[1];
dvander@2168
  2111
  pFKey->aCol = (struct sColMap*)z;
dvander@2168
  2112
  z += sizeof(struct sColMap)*nCol;
dvander@2168
  2113
  pFKey->zTo = z;
dvander@2168
  2114
  memcpy(z, pTo->z, pTo->n);
dvander@2168
  2115
  z[pTo->n] = 0;
dvander@2168
  2116
  z += pTo->n+1;
dvander@2168
  2117
  pFKey->pNextTo = 0;
dvander@2168
  2118
  pFKey->nCol = nCol;
dvander@2168
  2119
  if( pFromCol==0 ){
dvander@2168
  2120
    pFKey->aCol[0].iFrom = p->nCol-1;
dvander@2168
  2121
  }else{
dvander@2168
  2122
    for(i=0; i<nCol; i++){
dvander@2168
  2123
      int j;
dvander@2168
  2124
      for(j=0; j<p->nCol; j++){
dvander@2168
  2125
        if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zName)==0 ){
dvander@2168
  2126
          pFKey->aCol[i].iFrom = j;
dvander@2168
  2127
          break;
dvander@2168
  2128
        }
dvander@2168
  2129
      }
dvander@2168
  2130
      if( j>=p->nCol ){
dvander@2168
  2131
        sqlite3ErrorMsg(pParse, 
dvander@2168
  2132
          "unknown column \"%s\" in foreign key definition", 
dvander@2168
  2133
          pFromCol->a[i].zName);
dvander@2168
  2134
        goto fk_end;
dvander@2168
  2135
      }
dvander@2168
  2136
    }
dvander@2168
  2137
  }
dvander@2168
  2138
  if( pToCol ){
dvander@2168
  2139
    for(i=0; i<nCol; i++){
dvander@2168
  2140
      int n = strlen(pToCol->a[i].zName);
dvander@2168
  2141
      pFKey->aCol[i].zCol = z;
dvander@2168
  2142
      memcpy(z, pToCol->a[i].zName, n);
dvander@2168
  2143
      z[n] = 0;
dvander@2168
  2144
      z += n+1;
dvander@2168
  2145
    }
dvander@2168
  2146
  }
dvander@2168
  2147
  pFKey->isDeferred = 0;
dvander@2168
  2148
  pFKey->deleteConf = flags & 0xff;
dvander@2168
  2149
  pFKey->updateConf = (flags >> 8 ) & 0xff;
dvander@2168
  2150
  pFKey->insertConf = (flags >> 16 ) & 0xff;
dvander@2168
  2151
dvander@2168
  2152
  /* Link the foreign key to the table as the last step.
dvander@2168
  2153
  */
dvander@2168
  2154
  p->pFKey = pFKey;
dvander@2168
  2155
  pFKey = 0;
dvander@2168
  2156
dvander@2168
  2157
fk_end:
dvander@2168
  2158
  sqlite3_free(pFKey);
dvander@2168
  2159
#endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */
dvander@2168
  2160
  sqlite3ExprListDelete(pFromCol);
dvander@2168
  2161
  sqlite3ExprListDelete(pToCol);
dvander@2168
  2162
}
dvander@2168
  2163
dvander@2168
  2164
/*
dvander@2168
  2165
** This routine is called when an INITIALLY IMMEDIATE or INITIALLY DEFERRED
dvander@2168
  2166
** clause is seen as part of a foreign key definition.  The isDeferred
dvander@2168
  2167
** parameter is 1 for INITIALLY DEFERRED and 0 for INITIALLY IMMEDIATE.
dvander@2168
  2168
** The behavior of the most recently created foreign key is adjusted
dvander@2168
  2169
** accordingly.
dvander@2168
  2170
*/
dvander@2168
  2171
void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){
dvander@2168
  2172
#ifndef SQLITE_OMIT_FOREIGN_KEY
dvander@2168
  2173
  Table *pTab;
dvander@2168
  2174
  FKey *pFKey;
dvander@2168
  2175
  if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return;
dvander@2168
  2176
  pFKey->isDeferred = isDeferred;
dvander@2168
  2177
#endif
dvander@2168
  2178
}
dvander@2168
  2179
dvander@2168
  2180
/*
dvander@2168
  2181
** Generate code that will erase and refill index *pIdx.  This is
dvander@2168
  2182
** used to initialize a newly created index or to recompute the
dvander@2168
  2183
** content of an index in response to a REINDEX command.
dvander@2168
  2184
**
dvander@2168
  2185
** if memRootPage is not negative, it means that the index is newly
dvander@2168
  2186
** created.  The memory cell specified by memRootPage contains the
dvander@2168
  2187
** root page number of the index.  If memRootPage is negative, then
dvander@2168
  2188
** the index already exists and must be cleared before being refilled and
dvander@2168
  2189
** the root page number of the index is taken from pIndex->tnum.
dvander@2168
  2190
*/
dvander@2168
  2191
static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
dvander@2168
  2192
  Table *pTab = pIndex->pTable;  /* The table that is indexed */
dvander@2168
  2193
  int iTab = pParse->nTab;       /* Btree cursor used for pTab */
dvander@2168
  2194
  int iIdx = pParse->nTab+1;     /* Btree cursor used for pIndex */
dvander@2168
  2195
  int addr1;                     /* Address of top of loop */
dvander@2168
  2196
  int tnum;                      /* Root page of index */
dvander@2168
  2197
  Vdbe *v;                       /* Generate code into this virtual machine */
dvander@2168
  2198
  KeyInfo *pKey;                 /* KeyInfo for index */
dvander@2168
  2199
  sqlite3 *db = pParse->db;      /* The database connection */
dvander@2168
  2200
  int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
dvander@2168
  2201
dvander@2168
  2202
#ifndef SQLITE_OMIT_AUTHORIZATION
dvander@2168
  2203
  if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0,
dvander@2168
  2204
      db->aDb[iDb].zName ) ){
dvander@2168
  2205
    return;
dvander@2168
  2206
  }
dvander@2168
  2207
#endif
dvander@2168
  2208
dvander@2168
  2209
  /* Require a write-lock on the table to perform this operation */
dvander@2168
  2210
  sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName);
dvander@2168
  2211
dvander@2168
  2212
  v = sqlite3GetVdbe(pParse);
dvander@2168
  2213
  if( v==0 ) return;
dvander@2168
  2214
  if( memRootPage>=0 ){
dvander@2168
  2215
    sqlite3VdbeAddOp(v, OP_MemLoad, memRootPage, 0);
dvander@2168
  2216
    tnum = 0;
dvander@2168
  2217
  }else{
dvander@2168
  2218
    tnum = pIndex->tnum;
dvander@2168
  2219
    sqlite3VdbeAddOp(v, OP_Clear, tnum, iDb);
dvander@2168
  2220
  }
dvander@2168
  2221
  sqlite3VdbeAddOp(v, OP_Integer, iDb, 0);
dvander@2168
  2222
  pKey = sqlite3IndexKeyinfo(pParse, pIndex);
dvander@2168
  2223
  sqlite3VdbeOp3(v, OP_OpenWrite, iIdx, tnum, (char *)pKey, P3_KEYINFO_HANDOFF);
dvander@2168
  2224
  sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
dvander@2168
  2225
  addr1 = sqlite3VdbeAddOp(v, OP_Rewind, iTab, 0);
dvander@2168
  2226
  sqlite3GenerateIndexKey(v, pIndex, iTab);
dvander@2168
  2227
  if( pIndex->onError!=OE_None ){
dvander@2168
  2228
    int curaddr = sqlite3VdbeCurrentAddr(v);
dvander@2168
  2229
    int addr2 = curaddr+4;
dvander@2168
  2230
    sqlite3VdbeChangeP2(v, curaddr-1, addr2);
dvander@2168
  2231
    sqlite3VdbeAddOp(v, OP_Rowid, iTab, 0);
dvander@2168
  2232
    sqlite3VdbeAddOp(v, OP_AddImm, 1, 0);
dvander@2168
  2233
    sqlite3VdbeAddOp(v, OP_IsUnique, iIdx, addr2);
dvander@2168
  2234
    sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, OE_Abort,
dvander@2168
  2235
                    "indexed columns are not unique", P3_STATIC);
dvander@2168
  2236
    assert( db->mallocFailed || addr2==sqlite3VdbeCurrentAddr(v) );
dvander@2168
  2237
  }
dvander@2168
  2238
  sqlite3VdbeAddOp(v, OP_IdxInsert, iIdx, 0);
dvander@2168
  2239
  sqlite3VdbeAddOp(v, OP_Next, iTab, addr1+1);
dvander@2168
  2240
  sqlite3VdbeJumpHere(v, addr1);
dvander@2168
  2241
  sqlite3VdbeAddOp(v, OP_Close, iTab, 0);
dvander@2168
  2242
  sqlite3VdbeAddOp(v, OP_Close, iIdx, 0);
dvander@2168
  2243
}
dvander@2168
  2244
dvander@2168
  2245
/*
dvander@2168
  2246
** Create a new index for an SQL table.  pName1.pName2 is the name of the index 
dvander@2168
  2247
** and pTblList is the name of the table that is to be indexed.  Both will 
dvander@2168
  2248
** be NULL for a primary key or an index that is created to satisfy a
dvander@2168
  2249
** UNIQUE constraint.  If pTable and pIndex are NULL, use pParse->pNewTable
dvander@2168
  2250
** as the table to be indexed.  pParse->pNewTable is a table that is
dvander@2168
  2251
** currently being constructed by a CREATE TABLE statement.
dvander@2168
  2252
**
dvander@2168
  2253
** pList is a list of columns to be indexed.  pList will be NULL if this
dvander@2168
  2254
** is a primary key or unique-constraint on the most recent column added
dvander@2168
  2255
** to the table currently under construction.  
dvander@2168
  2256
*/
dvander@2168
  2257
void sqlite3CreateIndex(
dvander@2168
  2258
  Parse *pParse,     /* All information about this parse */
dvander@2168
  2259
  Token *pName1,     /* First part of index name. May be NULL */
dvander@2168
  2260
  Token *pName2,     /* Second part of index name. May be NULL */
dvander@2168
  2261
  SrcList *pTblName, /* Table to index. Use pParse->pNewTable if 0 */
dvander@2168
  2262
  ExprList *pList,   /* A list of columns to be indexed */
dvander@2168
  2263
  int onError,       /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */
dvander@2168
  2264
  Token *pStart,     /* The CREATE token that begins this statement */
dvander@2168
  2265
  Token *pEnd,       /* The ")" that closes the CREATE INDEX statement */
dvander@2168
  2266
  int sortOrder,     /* Sort order of primary key when pList==NULL */
dvander@2168
  2267
  int ifNotExist     /* Omit error if index already exists */
dvander@2168
  2268
){
dvander@2168
  2269
  Table *pTab = 0;     /* Table to be indexed */
dvander@2168
  2270
  Index *pIndex = 0;   /* The index to be created */
dvander@2168
  2271
  char *zName = 0;     /* Name of the index */
dvander@2168
  2272
  int nName;           /* Number of characters in zName */
dvander@2168
  2273
  int i, j;
dvander@2168
  2274
  Token nullId;        /* Fake token for an empty ID list */
dvander@2168
  2275
  DbFixer sFix;        /* For assigning database names to pTable */
dvander@2168
  2276
  int sortOrderMask;   /* 1 to honor DESC in index.  0 to ignore. */
dvander@2168
  2277
  sqlite3 *db = pParse->db;
dvander@2168
  2278
  Db *pDb;             /* The specific table containing the indexed database */
dvander@2168
  2279
  int iDb;             /* Index of the database that is being written */
dvander@2168
  2280
  Token *pName = 0;    /* Unqualified name of the index to create */
dvander@2168
  2281
  struct ExprList_item *pListItem; /* For looping over pList */
dvander@2168
  2282
  int nCol;
dvander@2168
  2283
  int nExtra = 0;
dvander@2168
  2284
  char *zExtra;
dvander@2168
  2285
dvander@2168
  2286
  if( pParse->nErr || db->mallocFailed || IN_DECLARE_VTAB ){
dvander@2168
  2287
    goto exit_create_index;
dvander@2168
  2288
  }
dvander@2168
  2289
dvander@2168
  2290
  /*
dvander@2168
  2291
  ** Find the table that is to be indexed.  Return early if not found.
dvander@2168
  2292
  */
dvander@2168
  2293
  if( pTblName!=0 ){
dvander@2168
  2294
dvander@2168
  2295
    /* Use the two-part index name to determine the database 
dvander@2168
  2296
    ** to search for the table. 'Fix' the table name to this db
dvander@2168
  2297
    ** before looking up the table.
dvander@2168
  2298
    */
dvander@2168
  2299
    assert( pName1 && pName2 );
dvander@2168
  2300
    iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
dvander@2168
  2301
    if( iDb<0 ) goto exit_create_index;
dvander@2168
  2302
dvander@2168
  2303
#ifndef SQLITE_OMIT_TEMPDB
dvander@2168
  2304
    /* If the index name was unqualified, check if the the table
dvander@2168
  2305
    ** is a temp table. If so, set the database to 1.
dvander@2168
  2306
    */
dvander@2168
  2307
    pTab = sqlite3SrcListLookup(pParse, pTblName);
dvander@2168
  2308
    if( pName2 && pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){
dvander@2168
  2309
      iDb = 1;
dvander@2168
  2310
    }
dvander@2168
  2311
#endif
dvander@2168
  2312
dvander@2168
  2313
    if( sqlite3FixInit(&sFix, pParse, iDb, "index", pName) &&
dvander@2168
  2314
        sqlite3FixSrcList(&sFix, pTblName)
dvander@2168
  2315
    ){
dvander@2168
  2316
      /* Because the parser constructs pTblName from a single identifier,
dvander@2168
  2317
      ** sqlite3FixSrcList can never fail. */
dvander@2168
  2318
      assert(0);
dvander@2168
  2319
    }
dvander@2168
  2320
    pTab = sqlite3LocateTable(pParse, pTblName->a[0].zName, 
dvander@2168
  2321
        pTblName->a[0].zDatabase);
dvander@2168
  2322
    if( !pTab ) goto exit_create_index;
dvander@2168
  2323
    assert( db->aDb[iDb].pSchema==pTab->pSchema );
dvander@2168
  2324
  }else{
dvander@2168
  2325
    assert( pName==0 );
dvander@2168
  2326
    pTab = pParse->pNewTable;
dvander@2168
  2327
    if( !pTab ) goto exit_create_index;
dvander@2168
  2328
    iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
dvander@2168
  2329
  }
dvander@2168
  2330
  pDb = &db->aDb[iDb];
dvander@2168
  2331
dvander@2168
  2332
  if( pTab==0 || pParse->nErr ) goto exit_create_index;
dvander@2168
  2333
  if( pTab->readOnly ){
dvander@2168
  2334
    sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName);
dvander@2168
  2335
    goto exit_create_index;
dvander@2168
  2336
  }
dvander@2168
  2337
#ifndef SQLITE_OMIT_VIEW
dvander@2168
  2338
  if( pTab->pSelect ){
dvander@2168
  2339
    sqlite3ErrorMsg(pParse, "views may not be indexed");
dvander@2168
  2340
    goto exit_create_index;
dvander@2168
  2341
  }
dvander@2168
  2342
#endif
dvander@2168
  2343
#ifndef SQLITE_OMIT_VIRTUALTABLE
dvander@2168
  2344
  if( IsVirtual(pTab) ){
dvander@2168
  2345
    sqlite3ErrorMsg(pParse, "virtual tables may not be indexed");
dvander@2168
  2346
    goto exit_create_index;
dvander@2168
  2347
  }
dvander@2168
  2348
#endif
dvander@2168
  2349
dvander@2168
  2350
  /*
dvander@2168
  2351
  ** Find the name of the index.  Make sure there is not already another
dvander@2168
  2352
  ** index or table with the same name.  
dvander@2168
  2353
  **
dvander@2168
  2354
  ** Exception:  If we are reading the names of permanent indices from the
dvander@2168
  2355
  ** sqlite_master table (because some other process changed the schema) and
dvander@2168
  2356
  ** one of the index names collides with the name of a temporary table or
dvander@2168
  2357
  ** index, then we will continue to process this index.
dvander@2168
  2358
  **
dvander@2168
  2359
  ** If pName==0 it means that we are
dvander@2168
  2360
  ** dealing with a primary key or UNIQUE constraint.  We have to invent our
dvander@2168
  2361
  ** own name.
dvander@2168
  2362
  */
dvander@2168
  2363
  if( pName ){
dvander@2168
  2364
    zName = sqlite3NameFromToken(db, pName);
dvander@2168
  2365
    if( SQLITE_OK!=sqlite3ReadSchema(pParse) ) goto exit_create_index;
dvander@2168
  2366
    if( zName==0 ) goto exit_create_index;
dvander@2168
  2367
    if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
dvander@2168
  2368
      goto exit_create_index;
dvander@2168
  2369
    }
dvander@2168
  2370
    if( !db->init.busy ){
dvander@2168
  2371
      if( SQLITE_OK!=sqlite3ReadSchema(pParse) ) goto exit_create_index;
dvander@2168
  2372
      if( sqlite3FindTable(db, zName, 0)!=0 ){
dvander@2168
  2373
        sqlite3ErrorMsg(pParse, "there is already a table named %s", zName);
dvander@2168
  2374
        goto exit_create_index;
dvander@2168
  2375
      }
dvander@2168
  2376
    }
dvander@2168
  2377
    if( sqlite3FindIndex(db, zName, pDb->zName)!=0 ){
dvander@2168
  2378
      if( !ifNotExist ){
dvander@2168
  2379
        sqlite3ErrorMsg(pParse, "index %s already exists", zName);
dvander@2168
  2380
      }
dvander@2168
  2381
      goto exit_create_index;
dvander@2168
  2382
    }
dvander@2168
  2383
  }else{
dvander@2168
  2384
    char zBuf[30];
dvander@2168
  2385
    int n;
dvander@2168
  2386
    Index *pLoop;
dvander@2168
  2387
    for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, n++){}
dvander@2168
  2388
    sqlite3_snprintf(sizeof(zBuf),zBuf,"_%d",n);
dvander@2168
  2389
    zName = 0;
dvander@2168
  2390
    sqlite3SetString(&zName, "sqlite_autoindex_", pTab->zName, zBuf, (char*)0);
dvander@2168
  2391
    if( zName==0 ){
dvander@2168
  2392
      db->mallocFailed = 1;
dvander@2168
  2393
      goto exit_create_index;
dvander@2168
  2394
    }
dvander@2168
  2395
  }
dvander@2168
  2396
dvander@2168
  2397
  /* Check for authorization to create an index.
dvander@2168
  2398
  */
dvander@2168
  2399
#ifndef SQLITE_OMIT_AUTHORIZATION
dvander@2168
  2400
  {
dvander@2168
  2401
    const char *zDb = pDb->zName;
dvander@2168
  2402
    if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){
dvander@2168
  2403
      goto exit_create_index;
dvander@2168
  2404
    }
dvander@2168
  2405
    i = SQLITE_CREATE_INDEX;
dvander@2168
  2406
    if( !OMIT_TEMPDB && iDb==1 ) i = SQLITE_CREATE_TEMP_INDEX;
dvander@2168
  2407
    if( sqlite3AuthCheck(pParse, i, zName, pTab->zName, zDb) ){
dvander@2168
  2408
      goto exit_create_index;
dvander@2168
  2409
    }
dvander@2168
  2410
  }
dvander@2168
  2411
#endif
dvander@2168
  2412
dvander@2168
  2413
  /* If pList==0, it means this routine was called to make a primary
dvander@2168
  2414
  ** key out of the last column added to the table under construction.
dvander@2168
  2415
  ** So create a fake list to simulate this.
dvander@2168
  2416
  */
dvander@2168
  2417
  if( pList==0 ){
dvander@2168
  2418
    nullId.z = (u8*)pTab->aCol[pTab->nCol-1].zName;
dvander@2168
  2419
    nullId.n = strlen((char*)nullId.z);
dvander@2168
  2420
    pList = sqlite3ExprListAppend(pParse, 0, 0, &nullId);
dvander@2168
  2421
    if( pList==0 ) goto exit_create_index;
dvander@2168
  2422
    pList->a[0].sortOrder = sortOrder;
dvander@2168
  2423
  }
dvander@2168
  2424
dvander@2168
  2425
  /* Figure out how many bytes of space are required to store explicitly
dvander@2168
  2426
  ** specified collation sequence names.
dvander@2168
  2427
  */
dvander@2168
  2428
  for(i=0; i<pList->nExpr; i++){
dvander@2168
  2429
    Expr *pExpr = pList->a[i].pExpr;
dvander@2168
  2430
    if( pExpr ){
dvander@2168
  2431
      nExtra += (1 + strlen(pExpr->pColl->zName));
dvander@2168
  2432
    }
dvander@2168
  2433
  }
dvander@2168
  2434
dvander@2168
  2435
  /* 
dvander@2168
  2436
  ** Allocate the index structure. 
dvander@2168
  2437
  */
dvander@2168
  2438
  nName = strlen(zName);
dvander@2168
  2439
  nCol = pList->nExpr;
dvander@2168
  2440
  pIndex = sqlite3DbMallocZero(db, 
dvander@2168
  2441
      sizeof(Index) +              /* Index structure  */
dvander@2168
  2442
      sizeof(int)*nCol +           /* Index.aiColumn   */
dvander@2168
  2443
      sizeof(int)*(nCol+1) +       /* Index.aiRowEst   */
dvander@2168
  2444
      sizeof(char *)*nCol +        /* Index.azColl     */
dvander@2168
  2445
      sizeof(u8)*nCol +            /* Index.aSortOrder */
dvander@2168
  2446
      nName + 1 +                  /* Index.zName      */
dvander@2168
  2447
      nExtra                       /* Collation sequence names */
dvander@2168
  2448
  );
dvander@2168
  2449
  if( db->mallocFailed ){
dvander@2168
  2450
    goto exit_create_index;
dvander@2168
  2451
  }
dvander@2168
  2452
  pIndex->azColl = (char**)(&pIndex[1]);
dvander@2168
  2453
  pIndex->aiColumn = (int *)(&pIndex->azColl[nCol]);
dvander@2168
  2454
  pIndex->aiRowEst = (unsigned *)(&pIndex->aiColumn[nCol]);
dvander@2168
  2455
  pIndex->aSortOrder = (u8 *)(&pIndex->aiRowEst[nCol+1]);
dvander@2168
  2456
  pIndex->zName = (char *)(&pIndex->aSortOrder[nCol]);
dvander@2168
  2457
  zExtra = (char *)(&pIndex->zName[nName+1]);
dvander@2168
  2458
  memcpy(pIndex->zName, zName, nName+1);
dvander@2168
  2459
  pIndex->pTable = pTab;
dvander@2168
  2460
  pIndex->nColumn = pList->nExpr;
dvander@2168
  2461
  pIndex->onError = onError;
dvander@2168
  2462
  pIndex->autoIndex = pName==0;
dvander@2168
  2463
  pIndex->pSchema = db->aDb[iDb].pSchema;
dvander@2168
  2464
dvander@2168
  2465
  /* Check to see if we should honor DESC requests on index columns
dvander@2168
  2466
  */
dvander@2168
  2467
  if( pDb->pSchema->file_format>=4 ){
dvander@2168
  2468
    sortOrderMask = -1;   /* Honor DESC */
dvander@2168
  2469
  }else{
dvander@2168
  2470
    sortOrderMask = 0;    /* Ignore DESC */
dvander@2168
  2471
  }
dvander@2168
  2472
dvander@2168
  2473
  /* Scan the names of the columns of the table to be indexed and
dvander@2168
  2474
  ** load the column indices into the Index structure.  Report an error
dvander@2168
  2475
  ** if any column is not found.
dvander@2168
  2476
  */
dvander@2168
  2477
  for(i=0, pListItem=pList->a; i<pList->nExpr; i++, pListItem++){
dvander@2168
  2478
    const char *zColName = pListItem->zName;
dvander@2168
  2479
    Column *pTabCol;
dvander@2168
  2480
    int requestedSortOrder;
dvander@2168
  2481
    char *zColl;                   /* Collation sequence name */
dvander@2168
  2482
dvander@2168
  2483
    for(j=0, pTabCol=pTab->aCol; j<pTab->nCol; j++, pTabCol++){
dvander@2168
  2484
      if( sqlite3StrICmp(zColName, pTabCol->zName)==0 ) break;
dvander@2168
  2485
    }
dvander@2168
  2486
    if( j>=pTab->nCol ){
dvander@2168
  2487
      sqlite3ErrorMsg(pParse, "table %s has no column named %s",
dvander@2168
  2488
        pTab->zName, zColName);
dvander@2168
  2489
      goto exit_create_index;
dvander@2168
  2490
    }
dvander@2168
  2491
    /* TODO:  Add a test to make sure that the same column is not named
dvander@2168
  2492
    ** more than once within the same index.  Only the first instance of
dvander@2168
  2493
    ** the column will ever be used by the optimizer.  Note that using the
dvander@2168
  2494
    ** same column more than once cannot be an error because that would 
dvander@2168
  2495
    ** break backwards compatibility - it needs to be a warning.
dvander@2168
  2496
    */
dvander@2168
  2497
    pIndex->aiColumn[i] = j;
dvander@2168
  2498
    if( pListItem->pExpr ){
dvander@2168
  2499
      assert( pListItem->pExpr->pColl );
dvander@2168
  2500
      zColl = zExtra;
dvander@2168
  2501
      sqlite3_snprintf(nExtra, zExtra, "%s", pListItem->pExpr->pColl->zName);
dvander@2168
  2502
      zExtra += (strlen(zColl) + 1);
dvander@2168
  2503
    }else{
dvander@2168
  2504
      zColl = pTab->aCol[j].zColl;
dvander@2168
  2505
      if( !zColl ){
dvander@2168
  2506
        zColl = db->pDfltColl->zName;
dvander@2168
  2507
      }
dvander@2168
  2508
    }
dvander@2168
  2509
    if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl, -1) ){
dvander@2168
  2510
      goto exit_create_index;
dvander@2168
  2511
    }
dvander@2168
  2512
    pIndex->azColl[i] = zColl;
dvander@2168
  2513
    requestedSortOrder = pListItem->sortOrder & sortOrderMask;
dvander@2168
  2514
    pIndex->aSortOrder[i] = requestedSortOrder;
dvander@2168
  2515
  }
dvander@2168
  2516
  sqlite3DefaultRowEst(pIndex);
dvander@2168
  2517
dvander@2168
  2518
  if( pTab==pParse->pNewTable ){
dvander@2168
  2519
    /* This routine has been called to create an automatic index as a
dvander@2168
  2520
    ** result of a PRIMARY KEY or UNIQUE clause on a column definition, or
dvander@2168
  2521
    ** a PRIMARY KEY or UNIQUE clause following the column definitions.
dvander@2168
  2522
    ** i.e. one of:
dvander@2168
  2523
    **
dvander@2168
  2524
    ** CREATE TABLE t(x PRIMARY KEY, y);
dvander@2168
  2525
    ** CREATE TABLE t(x, y, UNIQUE(x, y));
dvander@2168
  2526
    **
dvander@2168
  2527
    ** Either way, check to see if the table already has such an index. If
dvander@2168
  2528
    ** so, don't bother creating this one. This only applies to
dvander@2168
  2529
    ** automatically created indices. Users can do as they wish with
dvander@2168
  2530
    ** explicit indices.
dvander@2168
  2531
    */
dvander@2168
  2532
    Index *pIdx;
dvander@2168
  2533
    for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
dvander@2168
  2534
      int k;
dvander@2168
  2535
      assert( pIdx->onError!=OE_None );
dvander@2168
  2536
      assert( pIdx->autoIndex );
dvander@2168
  2537
      assert( pIndex->onError!=OE_None );
dvander@2168
  2538
dvander@2168
  2539
      if( pIdx->nColumn!=pIndex->nColumn ) continue;
dvander@2168
  2540
      for(k=0; k<pIdx->nColumn; k++){
dvander@2168
  2541
        const char *z1 = pIdx->azColl[k];
dvander@2168
  2542
        const char *z2 = pIndex->azColl[k];
dvander@2168
  2543
        if( pIdx->aiColumn[k]!=pIndex->aiColumn[k] ) break;
dvander@2168
  2544
        if( pIdx->aSortOrder[k]!=pIndex->aSortOrder[k] ) break;
dvander@2168
  2545
        if( z1!=z2 && sqlite3StrICmp(z1, z2) ) break;
dvander@2168
  2546
      }
dvander@2168
  2547
      if( k==pIdx->nColumn ){
dvander@2168
  2548
        if( pIdx->onError!=pIndex->onError ){
dvander@2168
  2549
          /* This constraint creates the same index as a previous
dvander@2168
  2550
          ** constraint specified somewhere in the CREATE TABLE statement.
dvander@2168
  2551
          ** However the ON CONFLICT clauses are different. If both this 
dvander@2168
  2552
          ** constraint and the previous equivalent constraint have explicit
dvander@2168
  2553
          ** ON CONFLICT clauses this is an error. Otherwise, use the
dvander@2168
  2554
          ** explicitly specified behaviour for the index.
dvander@2168
  2555
          */
dvander@2168
  2556
          if( !(pIdx->onError==OE_Default || pIndex->onError==OE_Default) ){
dvander@2168
  2557
            sqlite3ErrorMsg(pParse, 
dvander@2168
  2558
                "conflicting ON CONFLICT clauses specified", 0);
dvander@2168
  2559
          }
dvander@2168
  2560
          if( pIdx->onError==OE_Default ){
dvander@2168
  2561
            pIdx->onError = pIndex->onError;
dvander@2168
  2562
          }
dvander@2168
  2563
        }
dvander@2168
  2564
        goto exit_create_index;
dvander@2168
  2565
      }
dvander@2168
  2566
    }
dvander@2168
  2567
  }
dvander@2168
  2568
dvander@2168
  2569
  /* Link the new Index structure to its table and to the other
dvander@2168
  2570
  ** in-memory database structures. 
dvander@2168
  2571
  */
dvander@2168
  2572
  if( db->init.busy ){
dvander@2168
  2573
    Index *p;
dvander@2168
  2574
    p = sqlite3HashInsert(&pIndex->pSchema->idxHash, 
dvander@2168
  2575
                         pIndex->zName, strlen(pIndex->zName)+1, pIndex);
dvander@2168
  2576
    if( p ){
dvander@2168
  2577
      assert( p==pIndex );  /* Malloc must have failed */
dvander@2168
  2578
      db->mallocFailed = 1;
dvander@2168
  2579
      goto exit_create_index;
dvander@2168
  2580
    }
dvander@2168
  2581
    db->flags |= SQLITE_InternChanges;
dvander@2168
  2582
    if( pTblName!=0 ){
dvander@2168
  2583
      pIndex->tnum = db->init.newTnum;
dvander@2168
  2584
    }
dvander@2168
  2585
  }
dvander@2168
  2586
dvander@2168
  2587
  /* If the db->init.busy is 0 then create the index on disk.  This
dvander@2168
  2588
  ** involves writing the index into the master table and filling in the
dvander@2168
  2589
  ** index with the current table contents.
dvander@2168
  2590
  **
dvander@2168
  2591
  ** The db->init.busy is 0 when the user first enters a CREATE INDEX 
dvander@2168
  2592
  ** command.  db->init.busy is 1 when a database is opened and 
dvander@2168
  2593
  ** CREATE INDEX statements are read out of the master table.  In
dvander@2168
  2594
  ** the latter case the index already exists on disk, which is why
dvander@2168
  2595
  ** we don't want to recreate it.
dvander@2168
  2596
  **
dvander@2168
  2597
  ** If pTblName==0 it means this index is generated as a primary key
dvander@2168
  2598
  ** or UNIQUE constraint of a CREATE TABLE statement.  Since the table
dvander@2168
  2599
  ** has just been created, it contains no data and the index initialization
dvander@2168
  2600
  ** step can be skipped.
dvander@2168
  2601
  */
dvander@2168
  2602
  else if( db->init.busy==0 ){
dvander@2168
  2603
    Vdbe *v;
dvander@2168
  2604
    char *zStmt;
dvander@2168
  2605
    int iMem = pParse->nMem++;
dvander@2168
  2606
dvander@2168
  2607
    v = sqlite3GetVdbe(pParse);
dvander@2168
  2608
    if( v==0 ) goto exit_create_index;
dvander@2168
  2609
dvander@2168
  2610
dvander@2168
  2611
    /* Create the rootpage for the index
dvander@2168
  2612
    */
dvander@2168
  2613
    sqlite3BeginWriteOperation(pParse, 1, iDb);
dvander@2168
  2614
    sqlite3VdbeAddOp(v, OP_CreateIndex, iDb, 0);
dvander@2168
  2615
    sqlite3VdbeAddOp(v, OP_MemStore, iMem, 0);
dvander@2168
  2616
dvander@2168
  2617
    /* Gather the complete text of the CREATE INDEX statement into
dvander@2168
  2618
    ** the zStmt variable
dvander@2168
  2619
    */
dvander@2168
  2620
    if( pStart && pEnd ){
dvander@2168
  2621
      /* A named index with an explicit CREATE INDEX statement */
dvander@2168
  2622
      zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s",
dvander@2168
  2623
        onError==OE_None ? "" : " UNIQUE",
dvander@2168
  2624
        pEnd->z - pName->z + 1,
dvander@2168
  2625
        pName->z);
dvander@2168
  2626
    }else{
dvander@2168
  2627
      /* An automatic index created by a PRIMARY KEY or UNIQUE constraint */
dvander@2168
  2628
      /* zStmt = sqlite3MPrintf(""); */
dvander@2168
  2629
      zStmt = 0;
dvander@2168
  2630
    }
dvander@2168
  2631
dvander@2168
  2632
    /* Add an entry in sqlite_master for this index
dvander@2168
  2633
    */
dvander@2168
  2634
    sqlite3NestedParse(pParse, 
dvander@2168
  2635
        "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#0,%Q);",
dvander@2168
  2636
        db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
dvander@2168
  2637
        pIndex->zName,
dvander@2168
  2638
        pTab->zName,
dvander@2168
  2639
        zStmt
dvander@2168
  2640
    );
dvander@2168
  2641
    sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
dvander@2168
  2642
    sqlite3_free(zStmt);
dvander@2168
  2643
dvander@2168
  2644
    /* Fill the index with data and reparse the schema. Code an OP_Expire
dvander@2168
  2645
    ** to invalidate all pre-compiled statements.
dvander@2168
  2646
    */
dvander@2168
  2647
    if( pTblName ){
dvander@2168
  2648
      sqlite3RefillIndex(pParse, pIndex, iMem);
dvander@2168
  2649
      sqlite3ChangeCookie(db, v, iDb);
dvander@2168
  2650
      sqlite3VdbeOp3(v, OP_ParseSchema, iDb, 0,
dvander@2168
  2651
         sqlite3MPrintf(db, "name='%q'", pIndex->zName), P3_DYNAMIC);
dvander@2168
  2652
      sqlite3VdbeAddOp(v, OP_Expire, 0, 0);
dvander@2168
  2653
    }
dvander@2168
  2654
  }
dvander@2168
  2655
dvander@2168
  2656
  /* When adding an index to the list of indices for a table, make
dvander@2168
  2657
  ** sure all indices labeled OE_Replace come after all those labeled
dvander@2168
  2658
  ** OE_Ignore.  This is necessary for the correct operation of UPDATE
dvander@2168
  2659
  ** and INSERT.
dvander@2168
  2660
  */
dvander@2168
  2661
  if( db->init.busy || pTblName==0 ){
dvander@2168
  2662
    if( onError!=OE_Replace || pTab->pIndex==0
dvander@2168
  2663
         || pTab->pIndex->onError==OE_Replace){
dvander@2168
  2664
      pIndex->pNext = pTab->pIndex;
dvander@2168
  2665
      pTab->pIndex = pIndex;
dvander@2168
  2666
    }else{
dvander@2168
  2667
      Index *pOther = pTab->pIndex;
dvander@2168
  2668
      while( pOther->pNext && pOther->pNext->onError!=OE_Replace ){
dvander@2168
  2669
        pOther = pOther->pNext;
dvander@2168
  2670
      }
dvander@2168
  2671
      pIndex->pNext = pOther->pNext;
dvander@2168
  2672
      pOther->pNext = pIndex;
dvander@2168
  2673
    }
dvander@2168
  2674
    pIndex = 0;
dvander@2168
  2675
  }
dvander@2168
  2676
dvander@2168
  2677
  /* Clean up before exiting */
dvander@2168
  2678
exit_create_index:
dvander@2168
  2679
  if( pIndex ){
dvander@2168
  2680
    freeIndex(pIndex);
dvander@2168
  2681
  }
dvander@2168
  2682
  sqlite3ExprListDelete(pList);
dvander@2168
  2683
  sqlite3SrcListDelete(pTblName);
dvander@2168
  2684
  sqlite3_free(zName);
dvander@2168
  2685
  return;
dvander@2168
  2686
}
dvander@2168
  2687
dvander@2168
  2688
/*
dvander@2168
  2689
** Generate code to make sure the file format number is at least minFormat.
dvander@2168
  2690
** The generated code will increase the file format number if necessary.
dvander@2168
  2691
*/
dvander@2168
  2692
void sqlite3MinimumFileFormat(Parse *pParse, int iDb, int minFormat){
dvander@2168
  2693
  Vdbe *v;
dvander@2168
  2694
  v = sqlite3GetVdbe(pParse);
dvander@2168
  2695
  if( v ){
dvander@2168
  2696
    sqlite3VdbeAddOp(v, OP_ReadCookie, iDb, 1);
dvander@2168
  2697
    sqlite3VdbeUsesBtree(v, iDb);
dvander@2168
  2698
    sqlite3VdbeAddOp(v, OP_Integer, minFormat, 0);
dvander@2168
  2699
    sqlite3VdbeAddOp(v, OP_Ge, 0, sqlite3VdbeCurrentAddr(v)+3);
dvander@2168
  2700
    sqlite3VdbeAddOp(v, OP_Integer, minFormat, 0);
dvander@2168
  2701
    sqlite3VdbeAddOp(v, OP_SetCookie, iDb, 1);
dvander@2168
  2702
  }
dvander@2168
  2703
}
dvander@2168
  2704
dvander@2168
  2705
/*
dvander@2168
  2706
** Fill the Index.aiRowEst[] array with default information - information
dvander@2168
  2707
** to be used when we have not run the ANALYZE command.
dvander@2168
  2708
**
dvander@2168
  2709
** aiRowEst[0] is suppose to contain the number of elements in the index.
dvander@2168
  2710
** Since we do not know, guess 1 million.  aiRowEst[1] is an estimate of the
dvander@2168
  2711
** number of rows in the table that match any particular value of the
dvander@2168
  2712
** first column of the index.  aiRowEst[2] is an estimate of the number
dvander@2168
  2713
** of rows that match any particular combiniation of the first 2 columns
dvander@2168
  2714
** of the index.  And so forth.  It must always be the case that
dvander@2168
  2715
*
dvander@2168
  2716
**           aiRowEst[N]<=aiRowEst[N-1]
dvander@2168
  2717
**           aiRowEst[N]>=1
dvander@2168
  2718
**
dvander@2168
  2719
** Apart from that, we have little to go on besides intuition as to
dvander@2168
  2720
** how aiRowEst[] should be initialized.  The numbers generated here
dvander@2168
  2721
** are based on typical values found in actual indices.
dvander@2168
  2722
*/
dvander@2168
  2723
void sqlite3DefaultRowEst(Index *pIdx){
dvander@2168
  2724
  unsigned *a = pIdx->aiRowEst;
dvander@2168
  2725
  int i;
dvander@2168
  2726
  assert( a!=0 );
dvander@2168
  2727
  a[0] = 1000000;
dvander@2168
  2728
  for(i=pIdx->nColumn; i>=5; i--){
dvander@2168
  2729
    a[i] = 5;
dvander@2168
  2730
  }
dvander@2168
  2731
  while( i>=1 ){
dvander@2168
  2732
    a[i] = 11 - i;
dvander@2168
  2733
    i--;
dvander@2168
  2734
  }
dvander@2168
  2735
  if( pIdx->onError!=OE_None ){
dvander@2168
  2736
    a[pIdx->nColumn] = 1;
dvander@2168
  2737
  }
dvander@2168
  2738
}
dvander@2168
  2739
dvander@2168
  2740
/*
dvander@2168
  2741
** This routine will drop an existing named index.  This routine
dvander@2168
  2742
** implements the DROP INDEX statement.
dvander@2168
  2743
*/
dvander@2168
  2744
void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){
dvander@2168
  2745
  Index *pIndex;
dvander@2168
  2746
  Vdbe *v;
dvander@2168
  2747
  sqlite3 *db = pParse->db;
dvander@2168
  2748
  int iDb;
dvander@2168
  2749
dvander@2168
  2750
  if( pParse->nErr || db->mallocFailed ){
dvander@2168
  2751
    goto exit_drop_index;
dvander@2168
  2752
  }
dvander@2168
  2753
  assert( pName->nSrc==1 );
dvander@2168
  2754
  if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
dvander@2168
  2755
    goto exit_drop_index;
dvander@2168
  2756
  }
dvander@2168
  2757
  pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].zDatabase);
dvander@2168
  2758
  if( pIndex==0 ){
dvander@2168
  2759
    if( !ifExists ){
dvander@2168
  2760
      sqlite3ErrorMsg(pParse, "no such index: %S", pName, 0);
dvander@2168
  2761
    }
dvander@2168
  2762
    pParse->checkSchema = 1;
dvander@2168
  2763
    goto exit_drop_index;
dvander@2168
  2764
  }
dvander@2168
  2765
  if( pIndex->autoIndex ){
dvander@2168
  2766
    sqlite3ErrorMsg(pParse, "index associated with UNIQUE "
dvander@2168
  2767
      "or PRIMARY KEY constraint cannot be dropped", 0);
dvander@2168
  2768
    goto exit_drop_index;
dvander@2168
  2769
  }
dvander@2168
  2770
  iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
dvander@2168
  2771
#ifndef SQLITE_OMIT_AUTHORIZATION
dvander@2168
  2772
  {
dvander@2168
  2773
    int code = SQLITE_DROP_INDEX;
dvander@2168
  2774
    Table *pTab = pIndex->pTable;
dvander@2168
  2775
    const char *zDb = db->aDb[iDb].zName;
dvander@2168
  2776
    const char *zTab = SCHEMA_TABLE(iDb);
dvander@2168
  2777
    if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){
dvander@2168
  2778
      goto exit_drop_index;
dvander@2168
  2779
    }
dvander@2168
  2780
    if( !OMIT_TEMPDB && iDb ) code = SQLITE_DROP_TEMP_INDEX;
dvander@2168
  2781
    if( sqlite3AuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb) ){
dvander@2168
  2782
      goto exit_drop_index;
dvander@2168
  2783
    }
dvander@2168
  2784
  }
dvander@2168
  2785
#endif
dvander@2168
  2786
dvander@2168
  2787
  /* Generate code to remove the index and from the master table */
dvander@2168
  2788
  v = sqlite3GetVdbe(pParse);
dvander@2168
  2789
  if( v ){
dvander@2168
  2790
    sqlite3NestedParse(pParse,
dvander@2168
  2791
       "DELETE FROM %Q.%s WHERE name=%Q",
dvander@2168
  2792
       db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
dvander@2168
  2793
       pIndex->zName
dvander@2168
  2794
    );
dvander@2168
  2795
    sqlite3ChangeCookie(db, v, iDb);
dvander@2168
  2796
    destroyRootPage(pParse, pIndex->tnum, iDb);
dvander@2168
  2797
    sqlite3VdbeOp3(v, OP_DropIndex, iDb, 0, pIndex->zName, 0);
dvander@2168
  2798
  }
dvander@2168
  2799
dvander@2168
  2800
exit_drop_index:
dvander@2168
  2801
  sqlite3SrcListDelete(pName);
dvander@2168
  2802
}
dvander@2168
  2803
dvander@2168
  2804
/*
dvander@2168
  2805
** pArray is a pointer to an array of objects.  Each object in the
dvander@2168
  2806
** array is szEntry bytes in size.  This routine allocates a new
dvander@2168
  2807
** object on the end of the array.
dvander@2168
  2808
**
dvander@2168
  2809
** *pnEntry is the number of entries already in use.  *pnAlloc is
dvander@2168
  2810
** the previously allocated size of the array.  initSize is the
dvander@2168
  2811
** suggested initial array size allocation.
dvander@2168
  2812
**
dvander@2168
  2813
** The index of the new entry is returned in *pIdx.
dvander@2168
  2814
**
dvander@2168
  2815
** This routine returns a pointer to the array of objects.  This
dvander@2168
  2816
** might be the same as the pArray parameter or it might be a different
dvander@2168
  2817
** pointer if the array was resized.
dvander@2168
  2818
*/
dvander@2168
  2819
void *sqlite3ArrayAllocate(
dvander@2168
  2820
  sqlite3 *db,      /* Connection to notify of malloc failures */
dvander@2168
  2821
  void *pArray,     /* Array of objects.  Might be reallocated */
dvander@2168
  2822
  int szEntry,      /* Size of each object in the array */
dvander@2168
  2823
  int initSize,     /* Suggested initial allocation, in elements */
dvander@2168
  2824
  int *pnEntry,     /* Number of objects currently in use */
dvander@2168
  2825
  int *pnAlloc,     /* Current size of the allocation, in elements */
dvander@2168
  2826
  int *pIdx         /* Write the index of a new slot here */
dvander@2168
  2827
){
dvander@2168
  2828
  char *z;
dvander@2168
  2829
  if( *pnEntry >= *pnAlloc ){
dvander@2168
  2830
    void *pNew;
dvander@2168
  2831
    int newSize;
dvander@2168
  2832
    newSize = (*pnAlloc)*2 + initSize;
dvander@2168
  2833
    pNew = sqlite3DbRealloc(db, pArray, newSize*szEntry);
dvander@2168
  2834
    if( pNew==0 ){
dvander@2168
  2835
      *pIdx = -1;
dvander@2168
  2836
      return pArray;
dvander@2168
  2837
    }
dvander@2168
  2838
    *pnAlloc = newSize;
dvander@2168
  2839
    pArray = pNew;
dvander@2168
  2840
  }
dvander@2168
  2841
  z = (char*)pArray;
dvander@2168
  2842
  memset(&z[*pnEntry * szEntry], 0, szEntry);
dvander@2168
  2843
  *pIdx = *pnEntry;
dvander@2168
  2844
  ++*pnEntry;
dvander@2168
  2845
  return pArray;
dvander@2168
  2846
}
dvander@2168
  2847
dvander@2168
  2848
/*
dvander@2168
  2849
** Append a new element to the given IdList.  Create a new IdList if
dvander@2168
  2850
** need be.
dvander@2168
  2851
**
dvander@2168
  2852
** A new IdList is returned, or NULL if malloc() fails.
dvander@2168
  2853
*/
dvander@2168
  2854
IdList *sqlite3IdListAppend(sqlite3 *db, IdList *pList, Token *pToken){
dvander@2168
  2855
  int i;
dvander@2168
  2856
  if( pList==0 ){
dvander@2168
  2857
    pList = sqlite3DbMallocZero(db, sizeof(IdList) );
dvander@2168
  2858
    if( pList==0 ) return 0;
dvander@2168
  2859
    pList->nAlloc = 0;
dvander@2168
  2860
  }
dvander@2168
  2861
  pList->a = sqlite3ArrayAllocate(
dvander@2168
  2862
      db,
dvander@2168
  2863
      pList->a,
dvander@2168
  2864
      sizeof(pList->a[0]),
dvander@2168
  2865
      5,
dvander@2168
  2866
      &pList->nId,
dvander@2168
  2867
      &pList->nAlloc,
dvander@2168
  2868
      &i
dvander@2168
  2869
  );
dvander@2168
  2870
  if( i<0 ){
dvander@2168
  2871
    sqlite3IdListDelete(pList);
dvander@2168
  2872
    return 0;
dvander@2168
  2873
  }
dvander@2168
  2874
  pList->a[i].zName = sqlite3NameFromToken(db, pToken);
dvander@2168
  2875
  return pList;
dvander@2168
  2876
}
dvander@2168
  2877
dvander@2168
  2878
/*
dvander@2168
  2879
** Delete an IdList.
dvander@2168
  2880
*/
dvander@2168
  2881
void sqlite3IdListDelete(IdList *pList){
dvander@2168
  2882
  int i;
dvander@2168
  2883
  if( pList==0 ) return;
dvander@2168
  2884
  for(i=0; i<pList->nId; i++){
dvander@2168
  2885
    sqlite3_free(pList->a[i].zName);
dvander@2168
  2886
  }
dvander@2168
  2887
  sqlite3_free(pList->a);
dvander@2168
  2888
  sqlite3_free(pList);
dvander@2168
  2889
}
dvander@2168
  2890
dvander@2168
  2891
/*
dvander@2168
  2892
** Return the index in pList of the identifier named zId.  Return -1
dvander@2168
  2893
** if not found.
dvander@2168
  2894
*/
dvander@2168
  2895
int sqlite3IdListIndex(IdList *pList, const char *zName){
dvander@2168
  2896
  int i;
dvander@2168
  2897
  if( pList==0 ) return -1;
dvander@2168
  2898
  for(i=0; i<pList->nId; i++){
dvander@2168
  2899
    if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i;
dvander@2168
  2900
  }
dvander@2168
  2901
  return -1;
dvander@2168
  2902
}
dvander@2168
  2903
dvander@2168
  2904
/*
dvander@2168
  2905
** Append a new table name to the given SrcList.  Create a new SrcList if
dvander@2168
  2906
** need be.  A new entry is created in the SrcList even if pToken is NULL.
dvander@2168
  2907
**
dvander@2168
  2908
** A new SrcList is returned, or NULL if malloc() fails.
dvander@2168
  2909
**
dvander@2168
  2910
** If pDatabase is not null, it means that the table has an optional
dvander@2168
  2911
** database name prefix.  Like this:  "database.table".  The pDatabase
dvander@2168
  2912
** points to the table name and the pTable points to the database name.
dvander@2168
  2913
** The SrcList.a[].zName field is filled with the table name which might
dvander@2168
  2914
** come from pTable (if pDatabase is NULL) or from pDatabase.  
dvander@2168
  2915
** SrcList.a[].zDatabase is filled with the database name from pTable,
dvander@2168
  2916
** or with NULL if no database is specified.
dvander@2168
  2917
**
dvander@2168
  2918
** In other words, if call like this:
dvander@2168
  2919
**
dvander@2168
  2920
**         sqlite3SrcListAppend(D,A,B,0);
dvander@2168
  2921
**
dvander@2168
  2922
** Then B is a table name and the database name is unspecified.  If called
dvander@2168
  2923
** like this:
dvander@2168
  2924
**
dvander@2168
  2925
**         sqlite3SrcListAppend(D,A,B,C);
dvander@2168
  2926
**
dvander@2168
  2927
** Then C is the table name and B is the database name.
dvander@2168
  2928
*/
dvander@2168
  2929
SrcList *sqlite3SrcListAppend(
dvander@2168
  2930
  sqlite3 *db,        /* Connection to notify of malloc failures */
dvander@2168
  2931
  SrcList *pList,     /* Append to this SrcList. NULL creates a new SrcList */
dvander@2168
  2932
  Token *pTable,      /* Table to append */
dvander@2168
  2933
  Token *pDatabase    /* Database of the table */
dvander@2168
  2934
){
dvander@2168
  2935
  struct SrcList_item *pItem;
dvander@2168
  2936
  if( pList==0 ){
dvander@2168
  2937
    pList = sqlite3DbMallocZero(db, sizeof(SrcList) );
dvander@2168
  2938
    if( pList==0 ) return 0;
dvander@2168
  2939
    pList->nAlloc = 1;
dvander@2168
  2940
  }
dvander@2168
  2941
  if( pList->nSrc>=pList->nAlloc ){
dvander@2168
  2942
    SrcList *pNew;
dvander@2168
  2943
    pList->nAlloc *= 2;
dvander@2168
  2944
    pNew = sqlite3DbRealloc(db, pList,
dvander@2168
  2945
               sizeof(*pList) + (pList->nAlloc-1)*sizeof(pList->a[0]) );
dvander@2168
  2946
    if( pNew==0 ){
dvander@2168
  2947
      sqlite3SrcListDelete(pList);
dvander@2168
  2948
      return 0;
dvander@2168
  2949
    }
dvander@2168
  2950
    pList = pNew;
dvander@2168
  2951
  }
dvander@2168
  2952
  pItem = &pList->a[pList->nSrc];
dvander@2168
  2953
  memset(pItem, 0, sizeof(pList->a[0]));
dvander@2168
  2954
  if( pDatabase && pDatabase->z==0 ){
dvander@2168
  2955
    pDatabase = 0;
dvander@2168
  2956
  }
dvander@2168
  2957
  if( pDatabase && pTable ){
dvander@2168
  2958
    Token *pTemp = pDatabase;
dvander@2168
  2959
    pDatabase = pTable;
dvander@2168
  2960
    pTable = pTemp;
dvander@2168
  2961
  }
dvander@2168
  2962
  pItem->zName = sqlite3NameFromToken(db, pTable);
dvander@2168
  2963
  pItem->zDatabase = sqlite3NameFromToken(db, pDatabase);
dvander@2168
  2964
  pItem->iCursor = -1;
dvander@2168
  2965
  pItem->isPopulated = 0;
dvander@2168
  2966
  pList->nSrc++;
dvander@2168
  2967
  return pList;
dvander@2168
  2968
}
dvander@2168
  2969
dvander@2168
  2970
/*
dvander@2168
  2971
** Assign cursors to all tables in a SrcList
dvander@2168
  2972
*/
dvander@2168
  2973
void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){
dvander@2168
  2974
  int i;
dvander@2168
  2975
  struct SrcList_item *pItem;
dvander@2168
  2976
  assert(pList || pParse->db->mallocFailed );
dvander@2168
  2977
  if( pList ){
dvander@2168
  2978
    for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){
dvander@2168
  2979
      if( pItem->iCursor>=0 ) break;
dvander@2168
  2980
      pItem->iCursor = pParse->nTab++;
dvander@2168
  2981
      if( pItem->pSelect ){
dvander@2168
  2982
        sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc);
dvander@2168
  2983
      }
dvander@2168
  2984
    }
dvander@2168
  2985
  }
dvander@2168
  2986
}
dvander@2168
  2987
dvander@2168
  2988
/*
dvander@2168
  2989
** Delete an entire SrcList including all its substructure.
dvander@2168
  2990
*/
dvander@2168
  2991
void sqlite3SrcListDelete(SrcList *pList){
dvander@2168
  2992
  int i;
dvander@2168
  2993
  struct SrcList_item *pItem;
dvander@2168
  2994
  if( pList==0 ) return;
dvander@2168
  2995
  for(pItem=pList->a, i=0; i<pList->nSrc; i++, pItem++){
dvander@2168
  2996
    sqlite3_free(pItem->zDatabase);
dvander@2168
  2997
    sqlite3_free(pItem->zName);
dvander@2168
  2998
    sqlite3_free(pItem->zAlias);
dvander@2168
  2999
    sqlite3DeleteTable(pItem->pTab);
dvander@2168
  3000
    sqlite3SelectDelete(pItem->pSelect);
dvander@2168
  3001
    sqlite3ExprDelete(pItem->pOn);
dvander@2168
  3002
    sqlite3IdListDelete(pItem->pUsing);
dvander@2168
  3003
  }
dvander@2168
  3004
  sqlite3_free(pList);
dvander@2168
  3005
}
dvander@2168
  3006
dvander@2168
  3007
/*
dvander@2168
  3008
** This routine is called by the parser to add a new term to the
dvander@2168
  3009
** end of a growing FROM clause.  The "p" parameter is the part of
dvander@2168
  3010
** the FROM clause that has already been constructed.  "p" is NULL
dvander@2168
  3011
** if this is the first term of the FROM clause.  pTable and pDatabase
dvander@2168
  3012
** are the name of the table and database named in the FROM clause term.
dvander@2168
  3013
** pDatabase is NULL if the database name qualifier is missing - the
dvander@2168
  3014
** usual case.  If the term has a alias, then pAlias points to the
dvander@2168
  3015
** alias token.  If the term is a subquery, then pSubquery is the
dvander@2168
  3016
** SELECT statement that the subquery encodes.  The pTable and
dvander@2168
  3017
** pDatabase parameters are NULL for subqueries.  The pOn and pUsing
dvander@2168
  3018
** parameters are the content of the ON and USING clauses.
dvander@2168
  3019
**
dvander@2168
  3020
** Return a new SrcList which encodes is the FROM with the new
dvander@2168
  3021
** term added.
dvander@2168
  3022
*/
dvander@2168
  3023
SrcList *sqlite3SrcListAppendFromTerm(
dvander@2168
  3024
  Parse *pParse,          /* Parsing context */
dvander@2168
  3025
  SrcList *p,             /* The left part of the FROM clause already seen */
dvander@2168
  3026
  Token *pTable,          /* Name of the table to add to the FROM clause */
dvander@2168
  3027
  Token *pDatabase,       /* Name of the database containing pTable */
dvander@2168
  3028
  Token *pAlias,          /* The right-hand side of the AS subexpression */
dvander@2168
  3029
  Select *pSubquery,      /* A subquery used in place of a table name */
dvander@2168
  3030
  Expr *pOn,              /* The ON clause of a join */
dvander@2168
  3031
  IdList *pUsing          /* The USING clause of a join */
dvander@2168
  3032
){
dvander@2168
  3033
  struct SrcList_item *pItem;
dvander@2168
  3034
  sqlite3 *db = pParse->db;
dvander@2168
  3035
  p = sqlite3SrcListAppend(db, p, pTable, pDatabase);
dvander@2168
  3036
  if( p==0 || p->nSrc==0 ){
dvander@2168
  3037
    sqlite3ExprDelete(pOn);
dvander@2168
  3038
    sqlite3IdListDelete(pUsing);
dvander@2168
  3039
    sqlite3SelectDelete(pSubquery);
dvander@2168
  3040
    return p;
dvander@2168
  3041
  }
dvander@2168
  3042
  pItem = &p->a[p->nSrc-1];
dvander@2168
  3043
  if( pAlias && pAlias->n ){
dvander@2168
  3044
    pItem->zAlias = sqlite3NameFromToken(db, pAlias);
dvander@2168
  3045
  }
dvander@2168
  3046
  pItem->pSelect = pSubquery;
dvander@2168
  3047
  pItem->pOn = pOn;
dvander@2168
  3048
  pItem->pUsing = pUsing;
dvander@2168
  3049
  return p;
dvander@2168
  3050
}
dvander@2168
  3051
dvander@2168
  3052
/*
dvander@2168
  3053
** When building up a FROM clause in the parser, the join operator
dvander@2168
  3054
** is initially attached to the left operand.  But the code generator
dvander@2168
  3055
** expects the join operator to be on the right operand.  This routine
dvander@2168
  3056
** Shifts all join operators from left to right for an entire FROM
dvander@2168
  3057
** clause.
dvander@2168
  3058
**
dvander@2168
  3059
** Example: Suppose the join is like this:
dvander@2168
  3060
**
dvander@2168
  3061
**           A natural cross join B
dvander@2168
  3062
**
dvander@2168
  3063
** The operator is "natural cross join".  The A and B operands are stored
dvander@2168
  3064
** in p->a[0] and p->a[1], respectively.  The parser initially stores the
dvander@2168
  3065
** operator with A.  This routine shifts that operator over to B.
dvander@2168
  3066
*/
dvander@2168
  3067
void sqlite3SrcListShiftJoinType(SrcList *p){
dvander@2168
  3068
  if( p && p->a ){
dvander@2168
  3069
    int i;
dvander@2168
  3070
    for(i=p->nSrc-1; i>0; i--){
dvander@2168
  3071
      p->a[i].jointype = p->a[i-1].jointype;
dvander@2168
  3072
    }
dvander@2168
  3073
    p->a[0].jointype = 0;
dvander@2168
  3074
  }
dvander@2168
  3075
}
dvander@2168
  3076
dvander@2168
  3077
/*
dvander@2168
  3078
** Begin a transaction
dvander@2168
  3079
*/
dvander@2168
  3080
void sqlite3BeginTransaction(Parse *pParse, int type){
dvander@2168
  3081
  sqlite3 *db;
dvander@2168
  3082
  Vdbe *v;
dvander@2168
  3083
  int i;
dvander@2168
  3084
dvander@2168
  3085
  if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
dvander@2168
  3086
  if( pParse->nErr || db->mallocFailed ) return;
dvander@2168
  3087
  if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ) return;
dvander@2168
  3088
dvander@2168
  3089
  v = sqlite3GetVdbe(pParse);
dvander@2168
  3090
  if( !v ) return;
dvander@2168
  3091
  if( type!=TK_DEFERRED ){
dvander@2168
  3092
    for(i=0; i<db->nDb; i++){
dvander@2168
  3093
      sqlite3VdbeAddOp(v, OP_Transaction, i, (type==TK_EXCLUSIVE)+1);
dvander@2168
  3094
      sqlite3VdbeUsesBtree(v, i);
dvander@2168
  3095
    }
dvander@2168
  3096
  }
dvander@2168
  3097
  sqlite3VdbeAddOp(v, OP_AutoCommit, 0, 0);
dvander@2168
  3098
}
dvander@2168
  3099
dvander@2168
  3100
/*
dvander@2168
  3101
** Commit a transaction
dvander@2168
  3102
*/
dvander@2168
  3103
void sqlite3CommitTransaction(Parse *pParse){
dvander@2168
  3104
  sqlite3 *db;
dvander@2168
  3105
  Vdbe *v;
dvander@2168
  3106
dvander@2168
  3107
  if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
dvander@2168
  3108
  if( pParse->nErr || db->mallocFailed ) return;
dvander@2168
  3109
  if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ) return;
dvander@2168
  3110
dvander@2168
  3111
  v = sqlite3GetVdbe(pParse);
dvander@2168
  3112
  if( v ){
dvander@2168
  3113
    sqlite3VdbeAddOp(v, OP_AutoCommit, 1, 0);
dvander@2168
  3114
  }
dvander@2168
  3115
}
dvander@2168
  3116
dvander@2168
  3117
/*
dvander@2168
  3118
** Rollback a transaction
dvander@2168
  3119
*/
dvander@2168
  3120
void sqlite3RollbackTransaction(Parse *pParse){
dvander@2168
  3121
  sqlite3 *db;
dvander@2168
  3122
  Vdbe *v;
dvander@2168
  3123
dvander@2168
  3124
  if( pParse==0 || (db=pParse->db)==0 || db->aDb[0].pBt==0 ) return;
dvander@2168
  3125
  if( pParse->nErr || db->mallocFailed ) return;
dvander@2168
  3126
  if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ) return;
dvander@2168
  3127
dvander@2168
  3128
  v = sqlite3GetVdbe(pParse);
dvander@2168
  3129
  if( v ){
dvander@2168
  3130
    sqlite3VdbeAddOp(v, OP_AutoCommit, 1, 1);
dvander@2168
  3131
  }
dvander@2168
  3132
}
dvander@2168
  3133
dvander@2168
  3134
/*
dvander@2168
  3135
** Make sure the TEMP database is open and available for use.  Return
dvander@2168
  3136
** the number of errors.  Leave any error messages in the pParse structure.
dvander@2168
  3137
*/
dvander@2168
  3138
int sqlite3OpenTempDatabase(Parse *pParse){
dvander@2168
  3139
  sqlite3 *db = pParse->db;
dvander@2168
  3140
  if( db->aDb[1].pBt==0 && !pParse->explain ){
dvander@2168
  3141
    int rc;
dvander@2168
  3142
    static const int flags = 
dvander@2168
  3143
          SQLITE_OPEN_READWRITE |
dvander@2168
  3144
          SQLITE_OPEN_CREATE |
dvander@2168
  3145
          SQLITE_OPEN_EXCLUSIVE |
dvander@2168
  3146
          SQLITE_OPEN_DELETEONCLOSE |
dvander@2168
  3147
          SQLITE_OPEN_TEMP_DB;
dvander@2168
  3148
dvander@2168
  3149
    rc = sqlite3BtreeFactory(db, 0, 0, SQLITE_DEFAULT_CACHE_SIZE, flags,
dvander@2168
  3150
                                 &db->aDb[1].pBt);
dvander@2168
  3151
    if( rc!=SQLITE_OK ){
dvander@2168
  3152
      sqlite3ErrorMsg(pParse, "unable to open a temporary database "
dvander@2168
  3153
        "file for storing temporary tables");
dvander@2168
  3154
      pParse->rc = rc;
dvander@2168
  3155
      return 1;
dvander@2168
  3156
    }
dvander@2168
  3157
    if( db->flags & !db->autoCommit ){
dvander@2168
  3158
      rc = sqlite3BtreeBeginTrans(db->aDb[1].pBt, 1);
dvander@2168
  3159
      if( rc!=SQLITE_OK ){
dvander@2168
  3160
        sqlite3ErrorMsg(pParse, "unable to get a write lock on "
dvander@2168
  3161
          "the temporary database file");
dvander@2168
  3162
        pParse->rc = rc;
dvander@2168
  3163
        return 1;
dvander@2168
  3164
      }
dvander@2168
  3165
    }
dvander@2168
  3166
    assert( db->aDb[1].pSchema );
dvander@2168
  3167
  }
dvander@2168
  3168
  return 0;
dvander@2168
  3169
}
dvander@2168
  3170
dvander@2168
  3171
/*
dvander@2168
  3172
** Generate VDBE code that will verify the schema cookie and start
dvander@2168
  3173
** a read-transaction for all named database files.
dvander@2168
  3174
**
dvander@2168
  3175
** It is important that all schema cookies be verified and all
dvander@2168
  3176
** read transactions be started before anything else happens in
dvander@2168
  3177
** the VDBE program.  But this routine can be called after much other
dvander@2168
  3178
** code has been generated.  So here is what we do:
dvander@2168
  3179
**
dvander@2168
  3180
** The first time this routine is called, we code an OP_Goto that
dvander@2168
  3181
** will jump to a subroutine at the end of the program.  Then we
dvander@2168
  3182
** record every database that needs its schema verified in the
dvander@2168
  3183
** pParse->cookieMask field.  Later, after all other code has been
dvander@2168
  3184
** generated, the subroutine that does the cookie verifications and
dvander@2168
  3185
** starts the transactions will be coded and the OP_Goto P2 value
dvander@2168
  3186
** will be made to point to that subroutine.  The generation of the
dvander@2168
  3187
** cookie verification subroutine code happens in sqlite3FinishCoding().
dvander@2168
  3188
**
dvander@2168
  3189
** If iDb<0 then code the OP_Goto only - don't set flag to verify the
dvander@2168
  3190
** schema on any databases.  This can be used to position the OP_Goto
dvander@2168
  3191
** early in the code, before we know if any database tables will be used.
dvander@2168
  3192
*/
dvander@2168
  3193
void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
dvander@2168
  3194
  sqlite3 *db;
dvander@2168
  3195
  Vdbe *v;
dvander@2168
  3196
  int mask;
dvander@2168
  3197
dvander@2168
  3198
  v = sqlite3GetVdbe(pParse);
dvander@2168
  3199
  if( v==0 ) return;  /* This only happens if there was a prior error */
dvander@2168
  3200
  db = pParse->db;
dvander@2168
  3201
  if( pParse->cookieGoto==0 ){
dvander@2168
  3202
    pParse->cookieGoto = sqlite3VdbeAddOp(v, OP_Goto, 0, 0)+1;
dvander@2168
  3203
  }
dvander@2168
  3204
  if( iDb>=0 ){
dvander@2168
  3205
    assert( iDb<db->nDb );
dvander@2168
  3206
    assert( db->aDb[iDb].pBt!=0 || iDb==1 );
dvander@2168
  3207
    assert( iDb<SQLITE_MAX_ATTACHED+2 );
dvander@2168
  3208
    mask = 1<<iDb;
dvander@2168
  3209
    if( (pParse->cookieMask & mask)==0 ){
dvander@2168
  3210
      pParse->cookieMask |= mask;
dvander@2168
  3211
      pParse->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie;
dvander@2168
  3212
      if( !OMIT_TEMPDB && iDb==1 ){
dvander@2168
  3213
        sqlite3OpenTempDatabase(pParse);
dvander@2168
  3214
      }
dvander@2168
  3215
    }
dvander@2168
  3216
  }
dvander@2168
  3217
}
dvander@2168
  3218
dvander@2168
  3219
/*
dvander@2168
  3220
** Generate VDBE code that prepares for doing an operation that
dvander@2168
  3221
** might change the database.
dvander@2168
  3222
**
dvander@2168
  3223
** This routine starts a new transaction if we are not already within
dvander@2168
  3224
** a transaction.  If we are already within a transaction, then a checkpoint
dvander@2168
  3225
** is set if the setStatement parameter is true.  A checkpoint should
dvander@2168
  3226
** be set for operations that might fail (due to a constraint) part of
dvander@2168
  3227
** the way through and which will need to undo some writes without having to
dvander@2168
  3228
** rollback the whole transaction.  For operations where all constraints
dvander@2168
  3229
** can be checked before any changes are made to the database, it is never
dvander@2168
  3230
** necessary to undo a write and the checkpoint should not be set.
dvander@2168
  3231
**
dvander@2168
  3232
** Only database iDb and the temp database are made writable by this call.
dvander@2168
  3233
** If iDb==0, then the main and temp databases are made writable.   If
dvander@2168
  3234
** iDb==1 then only the temp database is made writable.  If iDb>1 then the
dvander@2168
  3235
** specified auxiliary database and the temp database are made writable.
dvander@2168
  3236
*/
dvander@2168
  3237
void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){
dvander@2168
  3238
  Vdbe *v = sqlite3GetVdbe(pParse);
dvander@2168
  3239
  if( v==0 ) return;
dvander@2168
  3240
  sqlite3CodeVerifySchema(pParse, iDb);
dvander@2168
  3241
  pParse->writeMask |= 1<<iDb;
dvander@2168
  3242
  if( setStatement && pParse->nested==0 ){
dvander@2168
  3243
    sqlite3VdbeAddOp(v, OP_Statement, iDb, 0);
dvander@2168
  3244
  }
dvander@2168
  3245
  if( (OMIT_TEMPDB || iDb!=1) && pParse->db->aDb[1].pBt!=0 ){
dvander@2168
  3246
    sqlite3BeginWriteOperation(pParse, setStatement, 1);
dvander@2168
  3247
  }
dvander@2168
  3248
}
dvander@2168
  3249
dvander@2168
  3250
/*
dvander@2168
  3251
** Check to see if pIndex uses the collating sequence pColl.  Return
dvander@2168
  3252
** true if it does and false if it does not.
dvander@2168
  3253
*/
dvander@2168
  3254
#ifndef SQLITE_OMIT_REINDEX
dvander@2168
  3255
static int collationMatch(const char *zColl, Index *pIndex){
dvander@2168
  3256
  int i;
dvander@2168
  3257
  for(i=0; i<pIndex->nColumn; i++){
dvander@2168
  3258
    const char *z = pIndex->azColl[i];
dvander@2168
  3259
    if( z==zColl || (z && zColl && 0==sqlite3StrICmp(z, zColl)) ){
dvander@2168
  3260
      return 1;
dvander@2168
  3261
    }
dvander@2168
  3262
  }
dvander@2168
  3263
  return 0;
dvander@2168
  3264
}
dvander@2168
  3265
#endif
dvander@2168
  3266
dvander@2168
  3267
/*
dvander@2168
  3268
** Recompute all indices of pTab that use the collating sequence pColl.
dvander@2168
  3269
** If pColl==0 then recompute all indices of pTab.
dvander@2168
  3270
*/
dvander@2168
  3271
#ifndef SQLITE_OMIT_REINDEX
dvander@2168
  3272
static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){
dvander@2168
  3273
  Index *pIndex;              /* An index associated with pTab */
dvander@2168
  3274
dvander@2168
  3275
  for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){
dvander@2168
  3276
    if( zColl==0 || collationMatch(zColl, pIndex) ){
dvander@2168
  3277
      int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
dvander@2168
  3278
      sqlite3BeginWriteOperation(pParse, 0, iDb);
dvander@2168
  3279
      sqlite3RefillIndex(pParse, pIndex, -1);
dvander@2168
  3280
    }
dvander@2168
  3281
  }
dvander@2168
  3282
}
dvander@2168
  3283
#endif
dvander@2168
  3284
dvander@2168
  3285
/*
dvander@2168
  3286
** Recompute all indices of all tables in all databases where the
dvander@2168
  3287
** indices use the collating sequence pColl.  If pColl==0 then recompute
dvander@2168
  3288
** all indices everywhere.
dvander@2168
  3289
*/
dvander@2168
  3290
#ifndef SQLITE_OMIT_REINDEX
dvander@2168
  3291
static void reindexDatabases(Parse *pParse, char const *zColl){
dvander@2168
  3292
  Db *pDb;                    /* A single database */
dvander@2168
  3293
  int iDb;                    /* The database index number */
dvander@2168
  3294
  sqlite3 *db = pParse->db;   /* The database connection */
dvander@2168
  3295
  HashElem *k;                /* For looping over tables in pDb */
dvander@2168
  3296
  Table *pTab;                /* A table in the database */
dvander@2168
  3297
dvander@2168
  3298
  for(iDb=0, pDb=db->aDb; iDb<db->nDb; iDb++, pDb++){
dvander@2168
  3299
    assert( pDb!=0 );
dvander@2168
  3300
    for(k=sqliteHashFirst(&pDb->pSchema->tblHash);  k; k=sqliteHashNext(k)){
dvander@2168
  3301
      pTab = (Table*)sqliteHashData(k);
dvander@2168
  3302
      reindexTable(pParse, pTab, zColl);
dvander@2168
  3303
    }
dvander@2168
  3304
  }
dvander@2168
  3305
}
dvander@2168
  3306
#endif
dvander@2168
  3307
dvander@2168
  3308
/*
dvander@2168
  3309
** Generate code for the REINDEX command.
dvander@2168
  3310
**
dvander@2168
  3311
**        REINDEX                            -- 1
dvander@2168
  3312
**        REINDEX  <collation>               -- 2
dvander@2168
  3313
**        REINDEX  ?<database>.?<tablename>  -- 3
dvander@2168
  3314
**        REINDEX  ?<database>.?<indexname>  -- 4
dvander@2168
  3315
**
dvander@2168
  3316
** Form 1 causes all indices in all attached databases to be rebuilt.
dvander@2168
  3317
** Form 2 rebuilds all indices in all databases that use the named
dvander@2168
  3318
** collating function.  Forms 3 and 4 rebuild the named index or all
dvander@2168
  3319
** indices associated with the named table.
dvander@2168
  3320
*/
dvander@2168
  3321
#ifndef SQLITE_OMIT_REINDEX
dvander@2168
  3322
void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){
dvander@2168
  3323
  CollSeq *pColl;             /* Collating sequence to be reindexed, or NULL */
dvander@2168
  3324
  char *z;                    /* Name of a table or index */
dvander@2168
  3325
  const char *zDb;            /* Name of the database */
dvander@2168
  3326
  Table *pTab;                /* A table in the database */
dvander@2168
  3327
  Index *pIndex;              /* An index associated with pTab */
dvander@2168
  3328
  int iDb;                    /* The database index number */
dvander@2168
  3329
  sqlite3 *db = pParse->db;   /* The database connection */
dvander@2168
  3330
  Token *pObjName;            /* Name of the table or index to be reindexed */
dvander@2168
  3331
dvander@2168
  3332
  /* Read the database schema. If an error occurs, leave an error message
dvander@2168
  3333
  ** and code in pParse and return NULL. */
dvander@2168
  3334
  if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
dvander@2168
  3335
    return;
dvander@2168
  3336
  }
dvander@2168
  3337
dvander@2168
  3338
  if( pName1==0 || pName1->z==0 ){
dvander@2168
  3339
    reindexDatabases(pParse, 0);
dvander@2168
  3340
    return;
dvander@2168
  3341
  }else if( pName2==0 || pName2->z==0 ){
dvander@2168
  3342
    assert( pName1->z );
dvander@2168
  3343
    pColl = sqlite3FindCollSeq(db, ENC(db), (char*)pName1->z, pName1->n, 0);
dvander@2168
  3344
    if( pColl ){
dvander@2168
  3345
      char *zColl = sqlite3DbStrNDup(db, (const char *)pName1->z, pName1->n);
dvander@2168
  3346
      if( zColl ){
dvander@2168
  3347
        reindexDatabases(pParse, zColl);
dvander@2168
  3348
        sqlite3_free(zColl);
dvander@2168
  3349
      }
dvander@2168
  3350
      return;
dvander@2168
  3351
    }
dvander@2168
  3352
  }
dvander@2168
  3353
  iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName);
dvander@2168
  3354
  if( iDb<0 ) return;
dvander@2168
  3355
  z = sqlite3NameFromToken(db, pObjName);
dvander@2168
  3356
  if( z==0 ) return;
dvander@2168
  3357
  zDb = db->aDb[iDb].zName;
dvander@2168
  3358
  pTab = sqlite3FindTable(db, z, zDb);
dvander@2168
  3359
  if( pTab ){
dvander@2168
  3360
    reindexTable(pParse, pTab, 0);
dvander@2168
  3361
    sqlite3_free(z);
dvander@2168
  3362
    return;
dvander@2168
  3363
  }
dvander@2168
  3364
  pIndex = sqlite3FindIndex(db, z, zDb);
dvander@2168
  3365
  sqlite3_free(z);
dvander@2168
  3366
  if( pIndex ){
dvander@2168
  3367
    sqlite3BeginWriteOperation(pParse, 0, iDb);
dvander@2168
  3368
    sqlite3RefillIndex(pParse, pIndex, -1);
dvander@2168
  3369
    return;
dvander@2168
  3370
  }
dvander@2168
  3371
  sqlite3ErrorMsg(pParse, "unable to identify the object to be reindexed");
dvander@2168
  3372
}
dvander@2168
  3373
#endif
dvander@2168
  3374
dvander@2168
  3375
/*
dvander@2168
  3376
** Return a dynamicly allocated KeyInfo structure that can be used
dvander@2168
  3377
** with OP_OpenRead or OP_OpenWrite to access database index pIdx.
dvander@2168
  3378
**
dvander@2168
  3379
** If successful, a pointer to the new structure is returned. In this case
dvander@2168
  3380
** the caller is responsible for calling sqlite3_free() on the returned 
dvander@2168
  3381
** pointer. If an error occurs (out of memory or missing collation 
dvander@2168
  3382
** sequence), NULL is returned and the state of pParse updated to reflect
dvander@2168
  3383
** the error.
dvander@2168
  3384
*/
dvander@2168
  3385
KeyInfo *sqlite3IndexKeyinfo(Parse *pParse, Index *pIdx){
dvander@2168
  3386
  int i;
dvander@2168
  3387
  int nCol = pIdx->nColumn;
dvander@2168
  3388
  int nBytes = sizeof(KeyInfo) + (nCol-1)*sizeof(CollSeq*) + nCol;
dvander@2168
  3389
  KeyInfo *pKey = (KeyInfo *)sqlite3DbMallocZero(pParse->db, nBytes);
dvander@2168
  3390
dvander@2168
  3391
  if( pKey ){
dvander@2168
  3392
    pKey->db = pParse->db;
dvander@2168
  3393
    pKey->aSortOrder = (u8 *)&(pKey->aColl[nCol]);
dvander@2168
  3394
    assert( &pKey->aSortOrder[nCol]==&(((u8 *)pKey)[nBytes]) );
dvander@2168
  3395
    for(i=0; i<nCol; i++){
dvander@2168
  3396
      char *zColl = pIdx->azColl[i];
dvander@2168
  3397
      assert( zColl );
dvander@2168
  3398
      pKey->aColl[i] = sqlite3LocateCollSeq(pParse, zColl, -1);
dvander@2168
  3399
      pKey->aSortOrder[i] = pIdx->aSortOrder[i];
dvander@2168
  3400
    }
dvander@2168
  3401
    pKey->nField = nCol;
dvander@2168
  3402
  }
dvander@2168
  3403
dvander@2168
  3404
  if( pParse->nErr ){
dvander@2168
  3405
    sqlite3_free(pKey);
dvander@2168
  3406
    pKey = 0;
dvander@2168
  3407
  }
dvander@2168
  3408
  return pKey;
dvander@2168
  3409
}