| author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> | 
| Thu, 19 Aug 2010 11:36:21 +0300 | |
| branch | RCL_3 | 
| changeset 21 | 28839de615b4 | 
| parent 0 | 08ec8eefde2f | 
| child 23 | 26645d81f48d | 
| permissions | -rw-r--r-- | 
| 0 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 1 | /* | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 2 | ** 2001 September 15 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 3 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 4 | ** The author disclaims copyright to this source code. In place of | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 5 | ** a legal notice, here is a blessing: | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 6 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 7 | ** May you do good and not evil. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 8 | ** May you find forgiveness for yourself and forgive others. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 9 | ** May you share freely, never taking more than you give. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 10 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 11 | ************************************************************************* | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 12 | ** This file contains C code routines that are called by the parser | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 13 | ** in order to generate code for DELETE FROM statements. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 14 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 15 | ** $Id: delete.c,v 1.171 2008/07/28 19:34:53 drh Exp $ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 16 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 17 | #include "sqliteInt.h" | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 18 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 19 | /* | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 20 | ** Look up every table that is named in pSrc. If any table is not found, | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 21 | ** add an error message to pParse->zErrMsg and return NULL. If all tables | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 22 | ** are found, return a pointer to the last table. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 23 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 24 | Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 25 | Table *pTab = 0; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 26 | int i; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 27 | struct SrcList_item *pItem; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 28 |   for(i=0, pItem=pSrc->a; i<pSrc->nSrc; i++, pItem++){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 29 | pTab = sqlite3LocateTable(pParse, 0, pItem->zName, pItem->zDatabase); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 30 | sqlite3DeleteTable(pItem->pTab); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 31 | pItem->pTab = pTab; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 32 |     if( pTab ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 33 | pTab->nRef++; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 34 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 35 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 36 | return pTab; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 37 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 38 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 39 | /* | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 40 | ** Check to make sure the given table is writable. If it is not | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 41 | ** writable, generate an error message and return 1. If it is | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 42 | ** writable return 0; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 43 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 44 | int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 45 | if( (pTab->readOnly && (pParse->db->flags & SQLITE_WriteSchema)==0 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 46 | && pParse->nested==0) | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 47 | #ifndef SQLITE_OMIT_VIRTUALTABLE | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 48 | || (pTab->pMod && pTab->pMod->pModule->xUpdate==0) | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 49 | #endif | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 50 |   ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 51 | sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 52 | return 1; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 53 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 54 | #ifndef SQLITE_OMIT_VIEW | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 55 |   if( !viewOk && pTab->pSelect ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 56 | sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 57 | return 1; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 58 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 59 | #endif | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 60 | return 0; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 61 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 62 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 63 | /* | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 64 | ** Generate code that will open a table for reading. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 65 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 66 | void sqlite3OpenTable( | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 67 | Parse *p, /* Generate code into this VDBE */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 68 | int iCur, /* The cursor number of the table */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 69 | int iDb, /* The database index in sqlite3.aDb[] */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 70 | Table *pTab, /* The table to be opened */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 71 | int opcode /* OP_OpenRead or OP_OpenWrite */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 72 | ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 73 | Vdbe *v; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 74 | if( IsVirtual(pTab) ) return; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 75 | v = sqlite3GetVdbe(p); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 76 | assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 77 | sqlite3TableLock(p, iDb, pTab->tnum, (opcode==OP_OpenWrite), pTab->zName); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 78 | sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, pTab->nCol); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 79 | sqlite3VdbeAddOp3(v, opcode, iCur, pTab->tnum, iDb); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 80 | VdbeComment((v, "%s", pTab->zName)); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 81 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 82 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 83 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 84 | #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 85 | /* | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 86 | ** Evaluate a view and store its result in an ephemeral table. The | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 87 | ** pWhere argument is an optional WHERE clause that restricts the | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 88 | ** set of rows in the view that are to be added to the ephemeral table. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 89 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 90 | void sqlite3MaterializeView( | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 91 | Parse *pParse, /* Parsing context */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 92 | Select *pView, /* View definition */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 93 | Expr *pWhere, /* Optional WHERE clause to be added */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 94 | int iCur /* Cursor number for ephemerial table */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 95 | ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 96 | SelectDest dest; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 97 | Select *pDup; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 98 | sqlite3 *db = pParse->db; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 99 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 100 | pDup = sqlite3SelectDup(db, pView); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 101 |   if( pWhere ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 102 | SrcList *pFrom; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 103 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 104 | pWhere = sqlite3ExprDup(db, pWhere); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 105 | pFrom = sqlite3SrcListAppendFromTerm(pParse, 0, 0, 0, 0, pDup, 0, 0); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 106 | pDup = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, 0, 0, 0, 0); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 107 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 108 | sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 109 | sqlite3Select(pParse, pDup, &dest, 0, 0, 0); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 110 | sqlite3SelectDelete(db, pDup); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 111 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 112 | #endif /* !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 113 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 114 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 115 | /* | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 116 | ** Generate code for a DELETE FROM statement. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 117 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 118 | ** DELETE FROM table_wxyz WHERE a<5 AND b NOT NULL; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 119 | ** \________/ \________________/ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 120 | ** pTabList pWhere | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 121 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 122 | void sqlite3DeleteFrom( | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 123 | Parse *pParse, /* The parser context */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 124 | SrcList *pTabList, /* The table from which we should delete things */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 125 | Expr *pWhere /* The WHERE clause. May be null */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 126 | ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 127 | Vdbe *v; /* The virtual database engine */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 128 | Table *pTab; /* The table from which records will be deleted */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 129 | const char *zDb; /* Name of database holding pTab */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 130 | int end, addr = 0; /* A couple addresses of generated code */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 131 | int i; /* Loop counter */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 132 | WhereInfo *pWInfo; /* Information about the WHERE clause */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 133 | Index *pIdx; /* For looping over indices of the table */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 134 | int iCur; /* VDBE Cursor number for pTab */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 135 | sqlite3 *db; /* Main database structure */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 136 | AuthContext sContext; /* Authorization context */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 137 | int oldIdx = -1; /* Cursor for the OLD table of AFTER triggers */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 138 | NameContext sNC; /* Name context to resolve expressions in */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 139 | int iDb; /* Database number */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 140 | int memCnt = 0; /* Memory cell used for change counting */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 141 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 142 | #ifndef SQLITE_OMIT_TRIGGER | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 143 | int isView; /* True if attempting to delete from a view */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 144 | int triggers_exist = 0; /* True if any triggers exist */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 145 | #endif | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 146 | int iBeginAfterTrigger; /* Address of after trigger program */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 147 | int iEndAfterTrigger; /* Exit of after trigger program */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 148 | int iBeginBeforeTrigger; /* Address of before trigger program */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 149 | int iEndBeforeTrigger; /* Exit of before trigger program */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 150 | u32 old_col_mask = 0; /* Mask of OLD.* columns in use */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 151 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 152 | sContext.pParse = 0; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 153 | db = pParse->db; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 154 |   if( pParse->nErr || db->mallocFailed ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 155 | goto delete_from_cleanup; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 156 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 157 | assert( pTabList->nSrc==1 ); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 158 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 159 | /* Locate the table which we want to delete. This table has to be | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 160 | ** put in an SrcList structure because some of the subroutines we | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 161 | ** will be calling are designed to work with multiple tables and expect | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 162 | ** an SrcList* parameter instead of just a Table* parameter. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 163 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 164 | pTab = sqlite3SrcListLookup(pParse, pTabList); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 165 | if( pTab==0 ) goto delete_from_cleanup; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 166 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 167 | /* Figure out if we have any triggers and if the table being | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 168 | ** deleted from is a view | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 169 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 170 | #ifndef SQLITE_OMIT_TRIGGER | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 171 | triggers_exist = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 172 | isView = pTab->pSelect!=0; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 173 | #else | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 174 | # define triggers_exist 0 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 175 | # define isView 0 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 176 | #endif | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 177 | #ifdef SQLITE_OMIT_VIEW | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 178 | # undef isView | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 179 | # define isView 0 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 180 | #endif | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 181 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 182 |   if( sqlite3IsReadOnly(pParse, pTab, triggers_exist) ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 183 | goto delete_from_cleanup; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 184 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 185 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 186 | assert( iDb<db->nDb ); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 187 | zDb = db->aDb[iDb].zName; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 188 |   if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 189 | goto delete_from_cleanup; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 190 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 191 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 192 | /* If pTab is really a view, make sure it has been initialized. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 193 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 194 |   if( sqlite3ViewGetColumnNames(pParse, pTab) ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 195 | goto delete_from_cleanup; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 196 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 197 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 198 | /* Allocate a cursor used to store the old.* data for a trigger. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 199 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 200 |   if( triggers_exist ){ 
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 201 | oldIdx = pParse->nTab++; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 202 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 203 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 204 | /* Assign cursor number to the table and all its indices. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 205 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 206 | assert( pTabList->nSrc==1 ); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 207 | iCur = pTabList->a[0].iCursor = pParse->nTab++; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 208 |   for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 209 | pParse->nTab++; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 210 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 211 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 212 | /* Start the view context | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 213 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 214 |   if( isView ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 215 | sqlite3AuthContextPush(pParse, &sContext, pTab->zName); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 216 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 217 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 218 | /* Begin generating code. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 219 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 220 | v = sqlite3GetVdbe(pParse); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 221 |   if( v==0 ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 222 | goto delete_from_cleanup; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 223 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 224 | if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 225 | sqlite3BeginWriteOperation(pParse, triggers_exist, iDb); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 226 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 227 |   if( triggers_exist ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 228 | int orconf = ((pParse->trigStack)?pParse->trigStack->orconf:OE_Default); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 229 | int iGoto = sqlite3VdbeAddOp0(v, OP_Goto); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 230 | addr = sqlite3VdbeMakeLabel(v); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 231 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 232 | iBeginBeforeTrigger = sqlite3VdbeCurrentAddr(v); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 233 | (void)sqlite3CodeRowTrigger(pParse, TK_DELETE, 0, TRIGGER_BEFORE, pTab, | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 234 | -1, oldIdx, orconf, addr, &old_col_mask, 0); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 235 | iEndBeforeTrigger = sqlite3VdbeAddOp0(v, OP_Goto); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 236 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 237 | iBeginAfterTrigger = sqlite3VdbeCurrentAddr(v); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 238 | (void)sqlite3CodeRowTrigger(pParse, TK_DELETE, 0, TRIGGER_AFTER, pTab, -1, | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 239 | oldIdx, orconf, addr, &old_col_mask, 0); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 240 | iEndAfterTrigger = sqlite3VdbeAddOp0(v, OP_Goto); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 241 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 242 | sqlite3VdbeJumpHere(v, iGoto); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 243 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 244 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 245 | /* If we are trying to delete from a view, realize that view into | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 246 | ** a ephemeral table. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 247 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 248 |   if( isView ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 249 | sqlite3MaterializeView(pParse, pTab->pSelect, pWhere, iCur); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 250 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 251 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 252 | /* Resolve the column names in the WHERE clause. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 253 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 254 | memset(&sNC, 0, sizeof(sNC)); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 255 | sNC.pParse = pParse; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 256 | sNC.pSrcList = pTabList; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 257 |   if( sqlite3ExprResolveNames(&sNC, pWhere) ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 258 | goto delete_from_cleanup; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 259 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 260 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 261 | /* Initialize the counter of the number of rows deleted, if | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 262 | ** we are counting rows. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 263 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 264 |   if( db->flags & SQLITE_CountRows ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 265 | memCnt = ++pParse->nMem; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 266 | sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 267 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 268 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 269 | /* Special case: A DELETE without a WHERE clause deletes everything. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 270 | ** It is easier just to erase the whole table. Note, however, that | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 271 | ** this means that the row change count will be incorrect. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 272 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 273 |   if( pWhere==0 && !triggers_exist && !IsVirtual(pTab) ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 274 |     if( db->flags & SQLITE_CountRows ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 275 | /* If counting rows deleted, just count the total number of | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 276 | ** entries in the table. */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 277 | int addr2; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 278 |       if( !isView ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 279 | sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 280 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 281 | sqlite3VdbeAddOp2(v, OP_Rewind, iCur, sqlite3VdbeCurrentAddr(v)+2); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 282 | addr2 = sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 283 | sqlite3VdbeAddOp2(v, OP_Next, iCur, addr2); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 284 | sqlite3VdbeAddOp1(v, OP_Close, iCur); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 285 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 286 |     if( !isView ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 287 | sqlite3VdbeAddOp2(v, OP_Clear, pTab->tnum, iDb); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 288 |       if( !pParse->nested ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 289 | sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_STATIC); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 290 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 291 |       for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 292 | assert( pIdx->pSchema==pTab->pSchema ); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 293 | sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 294 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 295 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 296 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 297 | /* The usual case: There is a WHERE clause so we have to scan through | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 298 | ** the table and pick which records to delete. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 299 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 300 |   else{
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 301 | int iRowid = ++pParse->nMem; /* Used for storing rowid values. */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 302 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 303 | /* Begin the database scan | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 304 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 305 | pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 306 | if( pWInfo==0 ) goto delete_from_cleanup; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 307 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 308 | /* Remember the rowid of every item to be deleted. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 309 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 310 | sqlite3VdbeAddOp2(v, IsVirtual(pTab) ? OP_VRowid : OP_Rowid, iCur, iRowid); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 311 | sqlite3VdbeAddOp1(v, OP_FifoWrite, iRowid); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 312 |     if( db->flags & SQLITE_CountRows ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 313 | sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 314 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 315 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 316 | /* End the database scan loop. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 317 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 318 | sqlite3WhereEnd(pWInfo); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 319 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 320 | /* Open the pseudo-table used to store OLD if there are triggers. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 321 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 322 |     if( triggers_exist ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 323 | sqlite3VdbeAddOp2(v, OP_SetNumColumns, 0, pTab->nCol); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 324 | sqlite3VdbeAddOp1(v, OP_OpenPseudo, oldIdx); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 325 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 326 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 327 | /* Delete every item whose key was written to the list during the | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 328 | ** database scan. We have to delete items after the scan is complete | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 329 | ** because deleting an item can change the scan order. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 330 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 331 | end = sqlite3VdbeMakeLabel(v); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 332 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 333 |     if( !isView ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 334 | /* Open cursors for the table we are deleting from and | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 335 | ** all its indices. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 336 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 337 | sqlite3OpenTableAndIndices(pParse, pTab, iCur, OP_OpenWrite); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 338 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 339 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 340 | /* This is the beginning of the delete loop. If a trigger encounters | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 341 | ** an IGNORE constraint, it jumps back to here. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 342 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 343 |     if( triggers_exist ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 344 | sqlite3VdbeResolveLabel(v, addr); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 345 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 346 | addr = sqlite3VdbeAddOp2(v, OP_FifoRead, iRowid, end); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 347 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 348 |     if( triggers_exist ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 349 | int iData = ++pParse->nMem; /* For storing row data of OLD table */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 350 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 351 | /* If the record is no longer present in the table, jump to the | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 352 | ** next iteration of the loop through the contents of the fifo. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 353 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 354 | sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, iRowid); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 355 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 356 | /* Populate the OLD.* pseudo-table */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 357 |       if( old_col_mask ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 358 | sqlite3VdbeAddOp2(v, OP_RowData, iCur, iData); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 359 |       }else{
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 360 | sqlite3VdbeAddOp2(v, OP_Null, 0, iData); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 361 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 362 | sqlite3VdbeAddOp3(v, OP_Insert, oldIdx, iData, iRowid); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 363 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 364 | /* Jump back and run the BEFORE triggers */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 365 | sqlite3VdbeAddOp2(v, OP_Goto, 0, iBeginBeforeTrigger); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 366 | sqlite3VdbeJumpHere(v, iEndBeforeTrigger); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 367 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 368 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 369 |     if( !isView ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 370 | /* Delete the row */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 371 | #ifndef SQLITE_OMIT_VIRTUALTABLE | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 372 |       if( IsVirtual(pTab) ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 373 | const char *pVtab = (const char *)pTab->pVtab; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 374 | sqlite3VtabMakeWritable(pParse, pTab); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 375 | sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iRowid, pVtab, P4_VTAB); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 376 | }else | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 377 | #endif | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 378 |       {
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 379 | sqlite3GenerateRowDelete(pParse, pTab, iCur, iRowid, pParse->nested==0); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 380 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 381 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 382 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 383 | /* If there are row triggers, close all cursors then invoke | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 384 | ** the AFTER triggers | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 385 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 386 |     if( triggers_exist ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 387 | /* Jump back and run the AFTER triggers */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 388 | sqlite3VdbeAddOp2(v, OP_Goto, 0, iBeginAfterTrigger); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 389 | sqlite3VdbeJumpHere(v, iEndAfterTrigger); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 390 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 391 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 392 | /* End of the delete loop */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 393 | sqlite3VdbeAddOp2(v, OP_Goto, 0, addr); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 394 | sqlite3VdbeResolveLabel(v, end); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 395 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 396 | /* Close the cursors after the loop if there are no row triggers */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 397 |     if( !isView  && !IsVirtual(pTab) ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 398 |       for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 399 | sqlite3VdbeAddOp2(v, OP_Close, iCur + i, pIdx->tnum); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 400 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 401 | sqlite3VdbeAddOp1(v, OP_Close, iCur); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 402 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 403 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 404 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 405 | /* | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 406 | ** Return the number of rows that were deleted. If this routine is | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 407 | ** generating code because of a call to sqlite3NestedParse(), do not | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 408 | ** invoke the callback function. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 409 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 410 |   if( db->flags & SQLITE_CountRows && pParse->nested==0 && !pParse->trigStack ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 411 | sqlite3VdbeAddOp2(v, OP_ResultRow, memCnt, 1); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 412 | sqlite3VdbeSetNumCols(v, 1); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 413 | sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", P4_STATIC); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 414 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 415 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 416 | delete_from_cleanup: | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 417 | sqlite3AuthContextPop(&sContext); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 418 | sqlite3SrcListDelete(db, pTabList); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 419 | sqlite3ExprDelete(db, pWhere); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 420 | return; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 421 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 422 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 423 | /* | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 424 | ** This routine generates VDBE code that causes a single row of a | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 425 | ** single table to be deleted. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 426 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 427 | ** The VDBE must be in a particular state when this routine is called. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 428 | ** These are the requirements: | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 429 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 430 | ** 1. A read/write cursor pointing to pTab, the table containing the row | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 431 | ** to be deleted, must be opened as cursor number "base". | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 432 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 433 | ** 2. Read/write cursors for all indices of pTab must be open as | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 434 | ** cursor number base+i for the i-th index. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 435 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 436 | ** 3. The record number of the row to be deleted must be stored in | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 437 | ** memory cell iRowid. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 438 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 439 | ** This routine pops the top of the stack to remove the record number | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 440 | ** and then generates code to remove both the table record and all index | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 441 | ** entries that point to that record. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 442 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 443 | void sqlite3GenerateRowDelete( | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 444 | Parse *pParse, /* Parsing context */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 445 | Table *pTab, /* Table containing the row to be deleted */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 446 | int iCur, /* Cursor number for the table */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 447 | int iRowid, /* Memory cell that contains the rowid to delete */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 448 | int count /* Increment the row change counter */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 449 | ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 450 | int addr; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 451 | Vdbe *v; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 452 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 453 | v = pParse->pVdbe; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 454 | addr = sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, iRowid); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 455 | sqlite3GenerateRowIndexDelete(pParse, pTab, iCur, 0); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 456 | sqlite3VdbeAddOp2(v, OP_Delete, iCur, (count?OPFLAG_NCHANGE:0)); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 457 |   if( count ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 458 | sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_STATIC); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 459 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 460 | sqlite3VdbeJumpHere(v, addr); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 461 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 462 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 463 | /* | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 464 | ** This routine generates VDBE code that causes the deletion of all | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 465 | ** index entries associated with a single row of a single table. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 466 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 467 | ** The VDBE must be in a particular state when this routine is called. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 468 | ** These are the requirements: | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 469 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 470 | ** 1. A read/write cursor pointing to pTab, the table containing the row | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 471 | ** to be deleted, must be opened as cursor number "iCur". | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 472 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 473 | ** 2. Read/write cursors for all indices of pTab must be open as | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 474 | ** cursor number iCur+i for the i-th index. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 475 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 476 | ** 3. The "iCur" cursor must be pointing to the row that is to be | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 477 | ** deleted. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 478 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 479 | void sqlite3GenerateRowIndexDelete( | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 480 | Parse *pParse, /* Parsing and code generating context */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 481 | Table *pTab, /* Table containing the row to be deleted */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 482 | int iCur, /* Cursor number for the table */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 483 | int *aRegIdx /* Only delete if aRegIdx!=0 && aRegIdx[i]>0 */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 484 | ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 485 | int i; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 486 | Index *pIdx; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 487 | int r1; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 488 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 489 |   for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 490 | if( aRegIdx!=0 && aRegIdx[i-1]==0 ) continue; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 491 | r1 = sqlite3GenerateIndexKey(pParse, pIdx, iCur, 0, 0); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 492 | sqlite3VdbeAddOp3(pParse->pVdbe, OP_IdxDelete, iCur+i, r1,pIdx->nColumn+1); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 493 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 494 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 495 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 496 | /* | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 497 | ** Generate code that will assemble an index key and put it in register | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 498 | ** regOut. The key with be for index pIdx which is an index on pTab. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 499 | ** iCur is the index of a cursor open on the pTab table and pointing to | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 500 | ** the entry that needs indexing. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 501 | ** | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 502 | ** Return a register number which is the first in a block of | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 503 | ** registers that holds the elements of the index key. The | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 504 | ** block of registers has already been deallocated by the time | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 505 | ** this routine returns. | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 506 | */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 507 | int sqlite3GenerateIndexKey( | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 508 | Parse *pParse, /* Parsing context */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 509 | Index *pIdx, /* The index for which to generate a key */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 510 | int iCur, /* Cursor number for the pIdx->pTable table */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 511 | int regOut, /* Write the new index key to this register */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 512 | int doMakeRec /* Run the OP_MakeRecord instruction if true */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 513 | ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 514 | Vdbe *v = pParse->pVdbe; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 515 | int j; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 516 | Table *pTab = pIdx->pTable; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 517 | int regBase; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 518 | int nCol; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 519 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 520 | nCol = pIdx->nColumn; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 521 | regBase = sqlite3GetTempRange(pParse, nCol+1); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 522 | sqlite3VdbeAddOp2(v, OP_Rowid, iCur, regBase+nCol); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 523 |   for(j=0; j<nCol; j++){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 524 | int idx = pIdx->aiColumn[j]; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 525 |     if( idx==pTab->iPKey ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 526 | sqlite3VdbeAddOp2(v, OP_SCopy, regBase+nCol, regBase+j); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 527 |     }else{
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 528 | sqlite3VdbeAddOp3(v, OP_Column, iCur, idx, regBase+j); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 529 | sqlite3ColumnDefault(v, pTab, idx); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 530 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 531 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 532 |   if( doMakeRec ){
 | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 533 | sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol+1, regOut); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 534 | sqlite3IndexAffinityStr(v, pIdx); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 535 | sqlite3ExprCacheAffinityChange(pParse, regBase, nCol+1); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 536 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 537 | sqlite3ReleaseTempRange(pParse, regBase, nCol+1); | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 538 | return regBase; | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 539 | } | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 540 | |
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 541 | /* Make sure "isView" gets undefined in case this file becomes part of | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 542 | ** the amalgamation - so that subsequent files do not see isView as a | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 543 | ** macro. */ | 
| 
08ec8eefde2f
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 544 | #undef isView |