mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-06 15:49:35 +03:00
Changes to the "sqlite" structure that allow simultaneous operations on
multiple database files. Many regession tests pass - but not all of them. Do not use this version except for debugging SQLite itself. (CVS 883) FossilOrigin-Name: d2fb2bb50cf1e13feb90995079f291384abd6ba9
This commit is contained in:
32
src/delete.c
32
src/delete.c
@@ -12,7 +12,7 @@
|
||||
** This file contains C code routines that are called by the parser
|
||||
** to handle DELETE FROM statements.
|
||||
**
|
||||
** $Id: delete.c,v 1.47 2003/03/20 01:16:59 drh Exp $
|
||||
** $Id: delete.c,v 1.48 2003/03/27 12:51:24 drh Exp $
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
|
||||
@@ -22,11 +22,15 @@
|
||||
** table is writeable. Generate an error and return NULL if not. If
|
||||
** everything checks out, return a pointer to the Table structure.
|
||||
*/
|
||||
Table *sqliteTableNameToTable(Parse *pParse, const char *zTab){
|
||||
Table *sqliteTableNameToTable(Parse *pParse, const char *zTab, const char *zDb){
|
||||
Table *pTab;
|
||||
pTab = sqliteFindTable(pParse->db, zTab);
|
||||
pTab = sqliteFindTable(pParse->db, zTab, zDb);
|
||||
if( pTab==0 ){
|
||||
sqliteSetString(&pParse->zErrMsg, "no such table: ", zTab, 0);
|
||||
if( zDb==0 || zDb[0]==0 ){
|
||||
sqliteSetString(&pParse->zErrMsg, "no such table: ", zTab, 0);
|
||||
}else{
|
||||
sqliteSetString(&pParse->zErrMsg, "no such table: ", zDb, ".", zTab, 0);
|
||||
}
|
||||
pParse->nErr++;
|
||||
return 0;
|
||||
}
|
||||
@@ -52,6 +56,7 @@ void sqliteDeleteFrom(
|
||||
Vdbe *v; /* The virtual database engine */
|
||||
Table *pTab; /* The table from which records will be deleted */
|
||||
char *zTab; /* Name of the table from which we are deleting */
|
||||
char *zDb; /* Name of database containing table zTab */
|
||||
int end, addr; /* A couple addresses of generated code */
|
||||
int i; /* Loop counter */
|
||||
WhereInfo *pWInfo; /* Information about the WHERE clause */
|
||||
@@ -73,8 +78,9 @@ void sqliteDeleteFrom(
|
||||
** defined
|
||||
*/
|
||||
zTab = pTabList->a[0].zName;
|
||||
zDb = pTabList->a[0].zDatabase;
|
||||
if( zTab != 0 ){
|
||||
pTab = sqliteFindTable(pParse->db, zTab);
|
||||
pTab = sqliteFindTable(pParse->db, zTab, zDb);
|
||||
if( pTab ){
|
||||
row_triggers_exist =
|
||||
sqliteTriggersExist(pParse, pTab->pTrigger,
|
||||
@@ -95,7 +101,7 @@ void sqliteDeleteFrom(
|
||||
** will be calling are designed to work with multiple tables and expect
|
||||
** an SrcList* parameter instead of just a Table* parameter.
|
||||
*/
|
||||
pTab = pTabList->a[0].pTab = sqliteTableNameToTable(pParse, zTab);
|
||||
pTab = pTabList->a[0].pTab = sqliteTableNameToTable(pParse, zTab, zDb);
|
||||
if( pTab==0 ){
|
||||
goto delete_from_cleanup;
|
||||
}
|
||||
@@ -129,7 +135,7 @@ void sqliteDeleteFrom(
|
||||
goto delete_from_cleanup;
|
||||
}
|
||||
sqliteBeginWriteOperation(pParse, row_triggers_exist,
|
||||
!row_triggers_exist && pTab->isTemp);
|
||||
!row_triggers_exist && pTab->iDb==1);
|
||||
|
||||
/* Initialize the counter of the number of rows deleted, if
|
||||
** we are counting rows.
|
||||
@@ -148,7 +154,7 @@ void sqliteDeleteFrom(
|
||||
** entries in the table. */
|
||||
int endOfLoop = sqliteVdbeMakeLabel(v);
|
||||
int addr;
|
||||
sqliteVdbeAddOp(v, OP_Integer, pTab->isTemp, 0);
|
||||
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
||||
sqliteVdbeAddOp(v, OP_OpenRead, base, pTab->tnum);
|
||||
sqliteVdbeAddOp(v, OP_Rewind, base, sqliteVdbeCurrentAddr(v)+2);
|
||||
addr = sqliteVdbeAddOp(v, OP_AddImm, 1, 0);
|
||||
@@ -156,9 +162,9 @@ void sqliteDeleteFrom(
|
||||
sqliteVdbeResolveLabel(v, endOfLoop);
|
||||
sqliteVdbeAddOp(v, OP_Close, base, 0);
|
||||
}
|
||||
sqliteVdbeAddOp(v, OP_Clear, pTab->tnum, pTab->isTemp);
|
||||
sqliteVdbeAddOp(v, OP_Clear, pTab->tnum, pTab->iDb);
|
||||
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
|
||||
sqliteVdbeAddOp(v, OP_Clear, pIdx->tnum, pTab->isTemp);
|
||||
sqliteVdbeAddOp(v, OP_Clear, pIdx->tnum, pIdx->iDb);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,7 +201,7 @@ void sqliteDeleteFrom(
|
||||
if( row_triggers_exist ){
|
||||
addr = sqliteVdbeAddOp(v, OP_ListRead, 0, end);
|
||||
sqliteVdbeAddOp(v, OP_Dup, 0, 0);
|
||||
sqliteVdbeAddOp(v, OP_Integer, pTab->isTemp, 0);
|
||||
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
||||
sqliteVdbeAddOp(v, OP_OpenRead, base, pTab->tnum);
|
||||
sqliteVdbeAddOp(v, OP_MoveTo, base, 0);
|
||||
sqliteVdbeAddOp(v, OP_OpenTemp, oldIdx, 0);
|
||||
@@ -225,10 +231,10 @@ void sqliteDeleteFrom(
|
||||
** cursors are opened only once on the outside the loop.
|
||||
*/
|
||||
pParse->nTab = base + 1;
|
||||
sqliteVdbeAddOp(v, OP_Integer, pTab->isTemp, 0);
|
||||
sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
|
||||
sqliteVdbeAddOp(v, OP_OpenWrite, base, pTab->tnum);
|
||||
for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){
|
||||
sqliteVdbeAddOp(v, OP_Integer, pTab->isTemp, 0);
|
||||
sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
|
||||
sqliteVdbeAddOp(v, OP_OpenWrite, pParse->nTab++, pIdx->tnum);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user