Index: third_party/sqlite/src/src/alter.c |
diff --git a/third_party/sqlite/src/src/alter.c b/third_party/sqlite/src/src/alter.c |
index 2b043ef158b87bb47fb96a0f089e760eeebf839a..067cbb896db5b78c9e7d9012d6cce26351d96596 100644 |
--- a/third_party/sqlite/src/src/alter.c |
+++ b/third_party/sqlite/src/src/alter.c |
@@ -229,7 +229,7 @@ static void renameTriggerFunc( |
** Register built-in functions used to help implement ALTER TABLE |
*/ |
void sqlite3AlterFunctions(void){ |
- static SQLITE_WSD FuncDef aAlterTableFuncs[] = { |
+ static FuncDef aAlterTableFuncs[] = { |
FUNCTION(sqlite_rename_table, 2, 0, 0, renameTableFunc), |
#ifndef SQLITE_OMIT_TRIGGER |
FUNCTION(sqlite_rename_trigger, 2, 0, 0, renameTriggerFunc), |
@@ -238,13 +238,7 @@ void sqlite3AlterFunctions(void){ |
FUNCTION(sqlite_rename_parent, 3, 0, 0, renameParentFunc), |
#endif |
}; |
- int i; |
- FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions); |
- FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aAlterTableFuncs); |
- |
- for(i=0; i<ArraySize(aAlterTableFuncs); i++){ |
- sqlite3FuncDefInsert(pHash, &aFunc[i]); |
- } |
+ sqlite3InsertBuiltinFuncs(aAlterTableFuncs, ArraySize(aAlterTableFuncs)); |
} |
/* |
@@ -419,7 +413,7 @@ void sqlite3AlterRenameTable( |
pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); |
if( !pTab ) goto exit_rename_table; |
iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); |
- zDb = db->aDb[iDb].zName; |
+ zDb = db->aDb[iDb].zDbSName; |
db->flags |= SQLITE_PreferBuiltin; |
/* Get a NULL terminated version of the new table name. */ |
@@ -510,7 +504,7 @@ void sqlite3AlterRenameTable( |
sqlite3NestedParse(pParse, |
"UPDATE \"%w\".%s SET " |
"sql = sqlite_rename_parent(sql, %Q, %Q) " |
- "WHERE %s;", zDb, SCHEMA_TABLE(iDb), zTabName, zName, zWhere); |
+ "WHERE %s;", zDb, MASTER_NAME, zTabName, zName, zWhere); |
sqlite3DbFree(db, zWhere); |
} |
} |
@@ -534,7 +528,7 @@ void sqlite3AlterRenameTable( |
"ELSE name END " |
"WHERE tbl_name=%Q COLLATE nocase AND " |
"(type='table' OR type='index' OR type='trigger');", |
- zDb, SCHEMA_TABLE(iDb), zName, zName, zName, |
+ zDb, MASTER_NAME, zName, zName, zName, |
#ifndef SQLITE_OMIT_TRIGGER |
zName, |
#endif |
@@ -588,33 +582,6 @@ exit_rename_table: |
db->flags = savedDbFlags; |
} |
- |
-/* |
-** Generate code to make sure the file format number is at least minFormat. |
-** The generated code will increase the file format number if necessary. |
-*/ |
-void sqlite3MinimumFileFormat(Parse *pParse, int iDb, int minFormat){ |
- Vdbe *v; |
- v = sqlite3GetVdbe(pParse); |
- /* The VDBE should have been allocated before this routine is called. |
- ** If that allocation failed, we would have quit before reaching this |
- ** point */ |
- if( ALWAYS(v) ){ |
- int r1 = sqlite3GetTempReg(pParse); |
- int r2 = sqlite3GetTempReg(pParse); |
- int addr1; |
- sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT); |
- sqlite3VdbeUsesBtree(v, iDb); |
- sqlite3VdbeAddOp2(v, OP_Integer, minFormat, r2); |
- addr1 = sqlite3VdbeAddOp3(v, OP_Ge, r2, 0, r1); |
- sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); VdbeCoverage(v); |
- sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, r2); |
- sqlite3VdbeJumpHere(v, addr1); |
- sqlite3ReleaseTempReg(pParse, r1); |
- sqlite3ReleaseTempReg(pParse, r2); |
- } |
-} |
- |
/* |
** This function is called after an "ALTER TABLE ... ADD" statement |
** has been parsed. Argument pColDef contains the text of the new |
@@ -633,15 +600,18 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ |
Column *pCol; /* The new column */ |
Expr *pDflt; /* Default value for the new column */ |
sqlite3 *db; /* The database connection; */ |
+ Vdbe *v = pParse->pVdbe; /* The prepared statement under construction */ |
+ int r1; /* Temporary registers */ |
db = pParse->db; |
if( pParse->nErr || db->mallocFailed ) return; |
+ assert( v!=0 ); |
pNew = pParse->pNewTable; |
assert( pNew ); |
assert( sqlite3BtreeHoldsAllMutexes(db) ); |
iDb = sqlite3SchemaToIndex(db, pNew->pSchema); |
- zDb = db->aDb[iDb].zName; |
+ zDb = db->aDb[iDb].zDbSName; |
zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */ |
pCol = &pNew->aCol[pNew->nCol-1]; |
pDflt = pCol->pDflt; |
@@ -659,7 +629,8 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ |
** literal NULL, then set pDflt to 0. This simplifies checking |
** for an SQL NULL default below. |
*/ |
- if( pDflt && pDflt->op==TK_NULL ){ |
+ assert( pDflt==0 || pDflt->op==TK_SPAN ); |
+ if( pDflt && pDflt->pLeft->op==TK_NULL ){ |
pDflt = 0; |
} |
@@ -695,7 +666,7 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ |
rc = sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_BLOB, &pVal); |
assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); |
if( rc!=SQLITE_OK ){ |
- db->mallocFailed = 1; |
+ assert( db->mallocFailed == 1 ); |
return; |
} |
if( !pVal ){ |
@@ -718,18 +689,25 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ |
"UPDATE \"%w\".%s SET " |
"sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) " |
"WHERE type = 'table' AND name = %Q", |
- zDb, SCHEMA_TABLE(iDb), pNew->addColOffset, zCol, pNew->addColOffset+1, |
+ zDb, MASTER_NAME, pNew->addColOffset, zCol, pNew->addColOffset+1, |
zTab |
); |
sqlite3DbFree(db, zCol); |
db->flags = savedDbFlags; |
} |
- /* If the default value of the new column is NULL, then set the file |
- ** format to 2. If the default value of the new column is not NULL, |
- ** the file format becomes 3. |
+ /* Make sure the schema version is at least 3. But do not upgrade |
+ ** from less than 3 to 4, as that will corrupt any preexisting DESC |
+ ** index. |
*/ |
- sqlite3MinimumFileFormat(pParse, iDb, pDflt ? 3 : 2); |
+ r1 = sqlite3GetTempReg(pParse); |
+ sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT); |
+ sqlite3VdbeUsesBtree(v, iDb); |
+ sqlite3VdbeAddOp2(v, OP_AddImm, r1, -2); |
+ sqlite3VdbeAddOp2(v, OP_IfPos, r1, sqlite3VdbeCurrentAddr(v)+2); |
+ VdbeCoverage(v); |
+ sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3); |
+ sqlite3ReleaseTempReg(pParse, r1); |
/* Reload the schema of the modified table. */ |
reloadTableSchema(pParse, pTab, pTab->zName); |
@@ -795,7 +773,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ |
pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table)); |
if( !pNew ) goto exit_begin_add_column; |
pParse->pNewTable = pNew; |
- pNew->nRef = 1; |
+ pNew->nTabRef = 1; |
pNew->nCol = pTab->nCol; |
assert( pNew->nCol>0 ); |
nAlloc = (((pNew->nCol-1)/8)*8)+8; |
@@ -803,7 +781,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ |
pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc); |
pNew->zName = sqlite3MPrintf(db, "sqlite_altertab_%s", pTab->zName); |
if( !pNew->aCol || !pNew->zName ){ |
- db->mallocFailed = 1; |
+ assert( db->mallocFailed ); |
goto exit_begin_add_column; |
} |
memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol); |
@@ -811,13 +789,11 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ |
Column *pCol = &pNew->aCol[i]; |
pCol->zName = sqlite3DbStrDup(db, pCol->zName); |
pCol->zColl = 0; |
- pCol->zType = 0; |
pCol->pDflt = 0; |
- pCol->zDflt = 0; |
} |
pNew->pSchema = db->aDb[iDb].pSchema; |
pNew->addColOffset = pTab->addColOffset; |
- pNew->nRef = 1; |
+ pNew->nTabRef = 1; |
/* Begin a transaction and increment the schema cookie. */ |
sqlite3BeginWriteOperation(pParse, 0, iDb); |