blob: 5b528169657155c8f152299964ca3142e45554c0 [file] [log] [blame]
drhcce7d172000-05-31 15:34:51 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drhcce7d172000-05-31 15:34:51 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drhcce7d172000-05-31 15:34:51 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drhcce7d172000-05-31 15:34:51 +000010**
11*************************************************************************
12** This file contains C code routines that are called by the parser
13** to handle UPDATE statements.
14**
danielk1977aee18ef2005-03-09 12:26:50 +000015** $Id: update.c,v 1.105 2005/03/09 12:26:51 danielk1977 Exp $
drhcce7d172000-05-31 15:34:51 +000016*/
17#include "sqliteInt.h"
18
19/*
danielk1977aee18ef2005-03-09 12:26:50 +000020** The most recently coded instruction was an OP_Column to retrieve column
21** 'i' of table pTab. This routine sets the P3 parameter of the
22** OP_Column to the default value, if any.
23**
24** The default value of a column is specified by a DEFAULT clause in the
25** column definition. This was either supplied by the user when the table
26** was created, or added later to the table definition by an ALTER TABLE
27** command. If the latter, then the row-records in the table btree on disk
28** may not contain a value for the column and the default value, taken
29** from the P3 parameter of the OP_Column instruction, is returned instead.
30** If the former, then all row-records are guaranteed to include a value
31** for the column and the P3 value is not required.
32**
33** Column definitions created by an ALTER TABLE command may only have
34** literal default values specified: a number, null or a string. (If a more
35** complicated default expression value was provided, it is evaluated
36** when the ALTER TABLE is executed and one of the literal values written
37** into the sqlite_master table.)
38**
39** Therefore, the P3 parameter is only required if the default value for
40** the column is a literal number, string or null. The sqlite3ValueFromExpr()
41** function is capable of transforming these types of expressions into
42** sqlite3_value objects.
43*/
44void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i){
45 if( pTab && !pTab->pSelect ){
46 sqlite3_value *pValue;
47 u8 enc = sqlite3VdbeDb(v)->enc;
48 Column *pCol = &pTab->aCol[i];
49 sqlite3ValueFromExpr(pCol->pDflt, enc, pCol->affinity, &pValue);
50 sqlite3VdbeChangeP3(v, -1, (const char *)pValue, P3_MEM);
51 }
52}
53
54/*
drhcce7d172000-05-31 15:34:51 +000055** Process an UPDATE statement.
drhb2fe7d82003-04-20 17:29:23 +000056**
57** UPDATE OR IGNORE table_wxyz SET a=b, c=d WHERE e<5 AND f NOT NULL;
58** \_______/ \________/ \______/ \________________/
59* onError pTabList pChanges pWhere
drhcce7d172000-05-31 15:34:51 +000060*/
danielk19774adee202004-05-08 08:23:19 +000061void sqlite3Update(
drhcce7d172000-05-31 15:34:51 +000062 Parse *pParse, /* The parser context */
drh113088e2003-03-20 01:16:58 +000063 SrcList *pTabList, /* The table in which we should change things */
drhcce7d172000-05-31 15:34:51 +000064 ExprList *pChanges, /* Things to be changed */
drh9cfcf5d2002-01-29 18:41:24 +000065 Expr *pWhere, /* The WHERE clause. May be null */
66 int onError /* How to handle constraint errors */
drhcce7d172000-05-31 15:34:51 +000067){
68 int i, j; /* Loop counters */
69 Table *pTab; /* The table to be updated */
danielk1977742f9472004-06-16 12:02:43 +000070 int addr = 0; /* VDBE instruction address of the start of the loop */
drhcce7d172000-05-31 15:34:51 +000071 WhereInfo *pWInfo; /* Information about the WHERE clause */
72 Vdbe *v; /* The virtual database engine */
73 Index *pIdx; /* For looping over indices */
74 int nIdx; /* Number of indices that need updating */
drh0ca3e242002-01-29 23:07:02 +000075 int nIdxTotal; /* Total number of indices */
drh6a3ea0e2003-05-02 14:32:12 +000076 int iCur; /* VDBE Cursor number of pTab */
drh9bb575f2004-09-06 17:24:11 +000077 sqlite3 *db; /* The database structure */
drhcce7d172000-05-31 15:34:51 +000078 Index **apIdx = 0; /* An array of indices that need updating too */
drhb2fe7d82003-04-20 17:29:23 +000079 char *aIdxUsed = 0; /* aIdxUsed[i]==1 if the i-th index is used */
drhcce7d172000-05-31 15:34:51 +000080 int *aXRef = 0; /* aXRef[i] is the index in pChanges->a[] of the
drh967e8b72000-06-21 13:59:10 +000081 ** an expression for the i-th column of the table.
82 ** aXRef[i]==-1 if the i-th column is not changed. */
drh4a324312001-12-21 14:30:42 +000083 int chngRecno; /* True if the record number is being changed */
danielk1977742f9472004-06-16 12:02:43 +000084 Expr *pRecnoExpr = 0; /* Expression defining the new record number */
85 int openAll = 0; /* True if all indices need to be opened */
drh85e20962003-04-25 17:52:11 +000086 AuthContext sContext; /* The authorization context */
danielk1977b3bce662005-01-29 08:32:43 +000087 NameContext sNC; /* The name-context to resolve expressions in */
drhcce7d172000-05-31 15:34:51 +000088
drh798da522004-11-04 04:42:28 +000089#ifndef SQLITE_OMIT_TRIGGER
90 int isView; /* Trying to update a view */
drhdca76842004-12-07 14:06:13 +000091 int triggers_exist = 0; /* True if any row triggers exist */
drh798da522004-11-04 04:42:28 +000092#endif
danielk1977c3f9bad2002-05-15 08:30:12 +000093
94 int newIdx = -1; /* index of trigger "new" temp table */
95 int oldIdx = -1; /* index of trigger "old" temp table */
96
drh85e20962003-04-25 17:52:11 +000097 sContext.pParse = 0;
danielk19776f8a5032004-05-10 10:34:51 +000098 if( pParse->nErr || sqlite3_malloc_failed ) goto update_cleanup;
drhecdc7532001-09-23 02:35:53 +000099 db = pParse->db;
drh113088e2003-03-20 01:16:58 +0000100 assert( pTabList->nSrc==1 );
drhdaffd0e2001-04-11 14:28:42 +0000101
drhb2fe7d82003-04-20 17:29:23 +0000102 /* Locate the table which we want to update.
drhcce7d172000-05-31 15:34:51 +0000103 */
danielk19774adee202004-05-08 08:23:19 +0000104 pTab = sqlite3SrcListLookup(pParse, pTabList);
drha69d9162003-04-17 22:57:53 +0000105 if( pTab==0 ) goto update_cleanup;
drhb7f91642004-10-31 02:22:47 +0000106
107 /* Figure out if we have any triggers and if the table being
108 ** updated is a view
109 */
110#ifndef SQLITE_OMIT_TRIGGER
drhdca76842004-12-07 14:06:13 +0000111 triggers_exist = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges);
drh5cf590c2003-04-24 01:45:04 +0000112 isView = pTab->pSelect!=0;
drhb7f91642004-10-31 02:22:47 +0000113#else
drhdca76842004-12-07 14:06:13 +0000114# define triggers_exist 0
drhb7f91642004-10-31 02:22:47 +0000115# define isView 0
116#endif
117#ifdef SQLITE_OMIT_VIEW
118# undef isView
119# define isView 0
120#endif
121
drhdca76842004-12-07 14:06:13 +0000122 if( sqlite3IsReadOnly(pParse, pTab, triggers_exist) ){
drh5cf590c2003-04-24 01:45:04 +0000123 goto update_cleanup;
drha69d9162003-04-17 22:57:53 +0000124 }
drh85e20962003-04-25 17:52:11 +0000125 if( isView ){
danielk19774adee202004-05-08 08:23:19 +0000126 if( sqlite3ViewGetColumnNames(pParse, pTab) ){
drh85e20962003-04-25 17:52:11 +0000127 goto update_cleanup;
128 }
drh5cf590c2003-04-24 01:45:04 +0000129 }
drheafe05b2004-06-13 00:54:01 +0000130 aXRef = sqliteMallocRaw( sizeof(int) * pTab->nCol );
drhcce7d172000-05-31 15:34:51 +0000131 if( aXRef==0 ) goto update_cleanup;
132 for(i=0; i<pTab->nCol; i++) aXRef[i] = -1;
133
drhb2fe7d82003-04-20 17:29:23 +0000134 /* If there are FOR EACH ROW triggers, allocate cursors for the
135 ** special OLD and NEW tables
136 */
drhdca76842004-12-07 14:06:13 +0000137 if( triggers_exist ){
danielk1977c3f9bad2002-05-15 08:30:12 +0000138 newIdx = pParse->nTab++;
139 oldIdx = pParse->nTab++;
140 }
141
drh53e3fc72002-07-16 17:22:50 +0000142 /* Allocate a cursors for the main database table and for all indices.
143 ** The index cursors might not be used, but if they are used they
144 ** need to occur right after the database cursor. So go ahead and
145 ** allocate enough space, just in case.
146 */
drh6a3ea0e2003-05-02 14:32:12 +0000147 pTabList->a[0].iCursor = iCur = pParse->nTab++;
drh53e3fc72002-07-16 17:22:50 +0000148 for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
149 pParse->nTab++;
150 }
151
danielk1977b3bce662005-01-29 08:32:43 +0000152 /* Initialize the name-context */
153 memset(&sNC, 0, sizeof(sNC));
154 sNC.pParse = pParse;
155 sNC.pSrcList = pTabList;
156
drh85e20962003-04-25 17:52:11 +0000157 /* Resolve the column names in all the expressions of the
158 ** of the UPDATE statement. Also find the column index
drhed6c8672003-01-12 18:02:16 +0000159 ** for each column to be updated in the pChanges array. For each
160 ** column to be updated, make sure we have authorization to change
161 ** that column.
drhcce7d172000-05-31 15:34:51 +0000162 */
drh4a324312001-12-21 14:30:42 +0000163 chngRecno = 0;
drhcce7d172000-05-31 15:34:51 +0000164 for(i=0; i<pChanges->nExpr; i++){
danielk1977b3bce662005-01-29 08:32:43 +0000165 if( sqlite3ExprResolveNames(&sNC, pChanges->a[i].pExpr) ){
drhcce7d172000-05-31 15:34:51 +0000166 goto update_cleanup;
167 }
168 for(j=0; j<pTab->nCol; j++){
danielk19774adee202004-05-08 08:23:19 +0000169 if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zName)==0 ){
drh9647ff82002-01-14 02:56:24 +0000170 if( j==pTab->iPKey ){
drh4a324312001-12-21 14:30:42 +0000171 chngRecno = 1;
172 pRecnoExpr = pChanges->a[i].pExpr;
173 }
drhcce7d172000-05-31 15:34:51 +0000174 aXRef[j] = i;
175 break;
176 }
177 }
178 if( j>=pTab->nCol ){
danielk19774adee202004-05-08 08:23:19 +0000179 if( sqlite3IsRowid(pChanges->a[i].zName) ){
drha0217ba2003-06-01 01:10:33 +0000180 chngRecno = 1;
181 pRecnoExpr = pChanges->a[i].pExpr;
182 }else{
danielk19774adee202004-05-08 08:23:19 +0000183 sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zName);
drha0217ba2003-06-01 01:10:33 +0000184 goto update_cleanup;
185 }
drhcce7d172000-05-31 15:34:51 +0000186 }
drhed6c8672003-01-12 18:02:16 +0000187#ifndef SQLITE_OMIT_AUTHORIZATION
drhe5f9c642003-01-13 23:27:31 +0000188 {
189 int rc;
danielk19774adee202004-05-08 08:23:19 +0000190 rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName,
drhe22a3342003-04-22 20:30:37 +0000191 pTab->aCol[j].zName, db->aDb[pTab->iDb].zName);
drhe5f9c642003-01-13 23:27:31 +0000192 if( rc==SQLITE_DENY ){
193 goto update_cleanup;
194 }else if( rc==SQLITE_IGNORE ){
195 aXRef[j] = -1;
196 }
drhed6c8672003-01-12 18:02:16 +0000197 }
198#endif
drhcce7d172000-05-31 15:34:51 +0000199 }
200
drh5a2c2c22001-11-21 02:21:11 +0000201 /* Allocate memory for the array apIdx[] and fill it with pointers to every
drhcce7d172000-05-31 15:34:51 +0000202 ** index that needs to be updated. Indices only need updating if their
drhc8392582001-12-31 02:48:51 +0000203 ** key includes one of the columns named in pChanges or if the record
204 ** number of the original table entry is changing.
drhcce7d172000-05-31 15:34:51 +0000205 */
drh0ca3e242002-01-29 23:07:02 +0000206 for(nIdx=nIdxTotal=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdxTotal++){
drh4a324312001-12-21 14:30:42 +0000207 if( chngRecno ){
208 i = 0;
209 }else {
210 for(i=0; i<pIdx->nColumn; i++){
211 if( aXRef[pIdx->aiColumn[i]]>=0 ) break;
212 }
drhcce7d172000-05-31 15:34:51 +0000213 }
drh967e8b72000-06-21 13:59:10 +0000214 if( i<pIdx->nColumn ) nIdx++;
drhcce7d172000-05-31 15:34:51 +0000215 }
drh0ca3e242002-01-29 23:07:02 +0000216 if( nIdxTotal>0 ){
drheafe05b2004-06-13 00:54:01 +0000217 apIdx = sqliteMallocRaw( sizeof(Index*) * nIdx + nIdxTotal );
drhb0729502001-03-14 12:35:57 +0000218 if( apIdx==0 ) goto update_cleanup;
drh0ca3e242002-01-29 23:07:02 +0000219 aIdxUsed = (char*)&apIdx[nIdx];
drhb0729502001-03-14 12:35:57 +0000220 }
drh0ca3e242002-01-29 23:07:02 +0000221 for(nIdx=j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
drh4a324312001-12-21 14:30:42 +0000222 if( chngRecno ){
223 i = 0;
224 }else{
225 for(i=0; i<pIdx->nColumn; i++){
226 if( aXRef[pIdx->aiColumn[i]]>=0 ) break;
227 }
drhcce7d172000-05-31 15:34:51 +0000228 }
drh0ca3e242002-01-29 23:07:02 +0000229 if( i<pIdx->nColumn ){
danielk19777cedc8d2004-06-10 10:50:08 +0000230 if( sqlite3CheckIndexCollSeq(pParse, pIdx) ) goto update_cleanup;
drh0ca3e242002-01-29 23:07:02 +0000231 apIdx[nIdx++] = pIdx;
232 aIdxUsed[j] = 1;
233 }else{
234 aIdxUsed[j] = 0;
235 }
drhcce7d172000-05-31 15:34:51 +0000236 }
237
drh85e20962003-04-25 17:52:11 +0000238 /* Resolve the column names in all the expressions in the
239 ** WHERE clause.
240 */
danielk1977b3bce662005-01-29 08:32:43 +0000241 if( sqlite3ExprResolveNames(&sNC, pWhere) ){
drh290c1942004-08-21 17:54:45 +0000242 goto update_cleanup;
drh85e20962003-04-25 17:52:11 +0000243 }
244
245 /* Start the view context
246 */
247 if( isView ){
danielk19774adee202004-05-08 08:23:19 +0000248 sqlite3AuthContextPush(pParse, &sContext, pTab->zName);
drh85e20962003-04-25 17:52:11 +0000249 }
250
drhcce7d172000-05-31 15:34:51 +0000251 /* Begin generating code.
252 */
danielk19774adee202004-05-08 08:23:19 +0000253 v = sqlite3GetVdbe(pParse);
drhcce7d172000-05-31 15:34:51 +0000254 if( v==0 ) goto update_cleanup;
drh4794f732004-11-05 17:17:50 +0000255 if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
danielk19774adee202004-05-08 08:23:19 +0000256 sqlite3BeginWriteOperation(pParse, 1, pTab->iDb);
drhcce7d172000-05-31 15:34:51 +0000257
drh5cf590c2003-04-24 01:45:04 +0000258 /* If we are trying to update a view, construct that view into
259 ** a temporary table.
260 */
261 if( isView ){
drh85e20962003-04-25 17:52:11 +0000262 Select *pView;
danielk19774adee202004-05-08 08:23:19 +0000263 pView = sqlite3SelectDup(pTab->pSelect);
danielk1977b3bce662005-01-29 08:32:43 +0000264 sqlite3Select(pParse, pView, SRT_TempTable, iCur, 0, 0, 0, 0);
danielk19774adee202004-05-08 08:23:19 +0000265 sqlite3SelectDelete(pView);
drh5cf590c2003-04-24 01:45:04 +0000266 }
267
drhcce7d172000-05-31 15:34:51 +0000268 /* Begin the database scan
269 */
drhe6f85e72004-12-25 01:03:13 +0000270 pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000271 if( pWInfo==0 ) goto update_cleanup;
272
273 /* Remember the index of every item to be updated.
274 */
drhe6f85e72004-12-25 01:03:13 +0000275 sqlite3VdbeAddOp(v, OP_Recno, iCur, 0);
danielk19774adee202004-05-08 08:23:19 +0000276 sqlite3VdbeAddOp(v, OP_ListWrite, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000277
278 /* End the database scan loop.
279 */
danielk19774adee202004-05-08 08:23:19 +0000280 sqlite3WhereEnd(pWInfo);
drhcce7d172000-05-31 15:34:51 +0000281
drh1bee3d72001-10-15 00:44:35 +0000282 /* Initialize the count of updated rows
283 */
danielk1977c3f9bad2002-05-15 08:30:12 +0000284 if( db->flags & SQLITE_CountRows && !pParse->trigStack ){
danielk19774adee202004-05-08 08:23:19 +0000285 sqlite3VdbeAddOp(v, OP_Integer, 0, 0);
drh1bee3d72001-10-15 00:44:35 +0000286 }
287
drhdca76842004-12-07 14:06:13 +0000288 if( triggers_exist ){
drh70ce3f02003-04-15 19:22:22 +0000289 /* Create pseudo-tables for NEW and OLD
290 */
danielk19774adee202004-05-08 08:23:19 +0000291 sqlite3VdbeAddOp(v, OP_OpenPseudo, oldIdx, 0);
danielk197784ac9d02004-05-18 09:58:06 +0000292 sqlite3VdbeAddOp(v, OP_SetNumColumns, oldIdx, pTab->nCol);
danielk19774adee202004-05-08 08:23:19 +0000293 sqlite3VdbeAddOp(v, OP_OpenPseudo, newIdx, 0);
danielk197784ac9d02004-05-18 09:58:06 +0000294 sqlite3VdbeAddOp(v, OP_SetNumColumns, newIdx, pTab->nCol);
danielk1977c3f9bad2002-05-15 08:30:12 +0000295
drh70ce3f02003-04-15 19:22:22 +0000296 /* The top of the update loop for when there are triggers.
297 */
danielk19774adee202004-05-08 08:23:19 +0000298 sqlite3VdbeAddOp(v, OP_ListRewind, 0, 0);
299 addr = sqlite3VdbeAddOp(v, OP_ListRead, 0, 0);
300 sqlite3VdbeAddOp(v, OP_Dup, 0, 0);
danielk1977c3f9bad2002-05-15 08:30:12 +0000301
drh70ce3f02003-04-15 19:22:22 +0000302 /* Open a cursor and make it point to the record that is
303 ** being updated.
304 */
danielk19774adee202004-05-08 08:23:19 +0000305 sqlite3VdbeAddOp(v, OP_Dup, 0, 0);
drh5cf590c2003-04-24 01:45:04 +0000306 if( !isView ){
drhad6d9462004-09-19 02:15:24 +0000307 sqlite3OpenTableForReading(v, iCur, pTab);
drh5cf590c2003-04-24 01:45:04 +0000308 }
drh7cf6e4d2004-05-19 14:56:55 +0000309 sqlite3VdbeAddOp(v, OP_MoveGe, iCur, 0);
danielk1977c3f9bad2002-05-15 08:30:12 +0000310
drh70ce3f02003-04-15 19:22:22 +0000311 /* Generate the OLD table
312 */
danielk19774adee202004-05-08 08:23:19 +0000313 sqlite3VdbeAddOp(v, OP_Recno, iCur, 0);
314 sqlite3VdbeAddOp(v, OP_RowData, iCur, 0);
315 sqlite3VdbeAddOp(v, OP_PutIntKey, oldIdx, 0);
danielk1977c3f9bad2002-05-15 08:30:12 +0000316
drh70ce3f02003-04-15 19:22:22 +0000317 /* Generate the NEW table
318 */
319 if( chngRecno ){
drh25303782004-12-07 15:41:48 +0000320 sqlite3ExprCodeAndCache(pParse, pRecnoExpr);
drh70ce3f02003-04-15 19:22:22 +0000321 }else{
danielk19774adee202004-05-08 08:23:19 +0000322 sqlite3VdbeAddOp(v, OP_Recno, iCur, 0);
drh70ce3f02003-04-15 19:22:22 +0000323 }
drh25303782004-12-07 15:41:48 +0000324 for(i=0; i<pTab->nCol; i++){
drh70ce3f02003-04-15 19:22:22 +0000325 if( i==pTab->iPKey ){
danielk19770f69c1e2004-05-29 11:24:50 +0000326 sqlite3VdbeAddOp(v, OP_String8, 0, 0);
drh70ce3f02003-04-15 19:22:22 +0000327 continue;
328 }
329 j = aXRef[i];
330 if( j<0 ){
danielk19774adee202004-05-08 08:23:19 +0000331 sqlite3VdbeAddOp(v, OP_Column, iCur, i);
danielk1977aee18ef2005-03-09 12:26:50 +0000332 sqlite3ColumnDefault(v, pTab, i);
danielk1977c3f9bad2002-05-15 08:30:12 +0000333 }else{
drh25303782004-12-07 15:41:48 +0000334 sqlite3ExprCodeAndCache(pParse, pChanges->a[j].pExpr);
danielk1977c3f9bad2002-05-15 08:30:12 +0000335 }
336 }
danielk19774adee202004-05-08 08:23:19 +0000337 sqlite3VdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0);
danielk1977a37cdde2004-05-16 11:15:36 +0000338 if( !isView ){
339 sqlite3TableAffinityStr(v, pTab);
340 }
341 if( pParse->nErr ) goto update_cleanup;
danielk19774adee202004-05-08 08:23:19 +0000342 sqlite3VdbeAddOp(v, OP_PutIntKey, newIdx, 0);
drh5cf590c2003-04-24 01:45:04 +0000343 if( !isView ){
danielk19774adee202004-05-08 08:23:19 +0000344 sqlite3VdbeAddOp(v, OP_Close, iCur, 0);
drh5cf590c2003-04-24 01:45:04 +0000345 }
danielk1977c3f9bad2002-05-15 08:30:12 +0000346
drh5cf590c2003-04-24 01:45:04 +0000347 /* Fire the BEFORE and INSTEAD OF triggers
drh70ce3f02003-04-15 19:22:22 +0000348 */
drhdca76842004-12-07 14:06:13 +0000349 if( sqlite3CodeRowTrigger(pParse, TK_UPDATE, pChanges, TRIGGER_BEFORE, pTab,
danielk19776f349032002-06-11 02:25:40 +0000350 newIdx, oldIdx, onError, addr) ){
danielk1977f29ce552002-05-19 23:43:12 +0000351 goto update_cleanup;
352 }
danielk1977c3f9bad2002-05-15 08:30:12 +0000353 }
354
drh5cf590c2003-04-24 01:45:04 +0000355 if( !isView ){
356 /*
357 ** Open every index that needs updating. Note that if any
358 ** index could potentially invoke a REPLACE conflict resolution
359 ** action, then we need to open all indices because we might need
360 ** to be deleting some records.
361 */
danielk19774adee202004-05-08 08:23:19 +0000362 sqlite3VdbeAddOp(v, OP_Integer, pTab->iDb, 0);
363 sqlite3VdbeAddOp(v, OP_OpenWrite, iCur, pTab->tnum);
danielk1977b4964b72004-05-18 01:23:38 +0000364 sqlite3VdbeAddOp(v, OP_SetNumColumns, iCur, pTab->nCol);
drh5cf590c2003-04-24 01:45:04 +0000365 if( onError==OE_Replace ){
366 openAll = 1;
367 }else{
368 openAll = 0;
369 for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
370 if( pIdx->onError==OE_Replace ){
371 openAll = 1;
372 break;
373 }
drh0ca3e242002-01-29 23:07:02 +0000374 }
375 }
drh5cf590c2003-04-24 01:45:04 +0000376 for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
377 if( openAll || aIdxUsed[i] ){
danielk19774adee202004-05-08 08:23:19 +0000378 sqlite3VdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
drhd3d39e92004-05-20 22:16:29 +0000379 sqlite3VdbeOp3(v, OP_OpenWrite, iCur+i+1, pIdx->tnum,
380 (char*)&pIdx->keyInfo, P3_KEYINFO);
drh6a3ea0e2003-05-02 14:32:12 +0000381 assert( pParse->nTab>iCur+i+1 );
drh5cf590c2003-04-24 01:45:04 +0000382 }
drh0ca3e242002-01-29 23:07:02 +0000383 }
drhcce7d172000-05-31 15:34:51 +0000384
drh5cf590c2003-04-24 01:45:04 +0000385 /* Loop over every record that needs updating. We have to load
386 ** the old data for each record to be updated because some columns
387 ** might not change and we will need to copy the old value.
388 ** Also, the old data is needed to delete the old index entires.
389 ** So make the cursor point at the old record.
390 */
drhdca76842004-12-07 14:06:13 +0000391 if( !triggers_exist ){
danielk19774adee202004-05-08 08:23:19 +0000392 sqlite3VdbeAddOp(v, OP_ListRewind, 0, 0);
393 addr = sqlite3VdbeAddOp(v, OP_ListRead, 0, 0);
394 sqlite3VdbeAddOp(v, OP_Dup, 0, 0);
drh4a324312001-12-21 14:30:42 +0000395 }
danielk19774adee202004-05-08 08:23:19 +0000396 sqlite3VdbeAddOp(v, OP_NotExists, iCur, addr);
drh5cf590c2003-04-24 01:45:04 +0000397
398 /* If the record number will change, push the record number as it
399 ** will be after the update. (The old record number is currently
400 ** on top of the stack.)
401 */
402 if( chngRecno ){
danielk19774adee202004-05-08 08:23:19 +0000403 sqlite3ExprCode(pParse, pRecnoExpr);
404 sqlite3VdbeAddOp(v, OP_MustBeInt, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000405 }
drh5cf590c2003-04-24 01:45:04 +0000406
407 /* Compute new data for this record.
408 */
409 for(i=0; i<pTab->nCol; i++){
410 if( i==pTab->iPKey ){
danielk19770f69c1e2004-05-29 11:24:50 +0000411 sqlite3VdbeAddOp(v, OP_String8, 0, 0);
drh5cf590c2003-04-24 01:45:04 +0000412 continue;
413 }
414 j = aXRef[i];
415 if( j<0 ){
danielk19774adee202004-05-08 08:23:19 +0000416 sqlite3VdbeAddOp(v, OP_Column, iCur, i);
danielk1977aee18ef2005-03-09 12:26:50 +0000417 sqlite3ColumnDefault(v, pTab, i);
drh5cf590c2003-04-24 01:45:04 +0000418 }else{
danielk19774adee202004-05-08 08:23:19 +0000419 sqlite3ExprCode(pParse, pChanges->a[j].pExpr);
drh5cf590c2003-04-24 01:45:04 +0000420 }
421 }
422
423 /* Do constraint checks
424 */
danielk19774adee202004-05-08 08:23:19 +0000425 sqlite3GenerateConstraintChecks(pParse, pTab, iCur, aIdxUsed, chngRecno, 1,
drh5cf590c2003-04-24 01:45:04 +0000426 onError, addr);
427
428 /* Delete the old indices for the current record.
429 */
danielk19774adee202004-05-08 08:23:19 +0000430 sqlite3GenerateRowIndexDelete(db, v, pTab, iCur, aIdxUsed);
drh5cf590c2003-04-24 01:45:04 +0000431
432 /* If changing the record number, delete the old record.
433 */
434 if( chngRecno ){
danielk19774adee202004-05-08 08:23:19 +0000435 sqlite3VdbeAddOp(v, OP_Delete, iCur, 0);
drh5cf590c2003-04-24 01:45:04 +0000436 }
437
438 /* Create the new index entries and the new record.
439 */
danielk19774adee202004-05-08 08:23:19 +0000440 sqlite3CompleteInsertion(pParse, pTab, iCur, aIdxUsed, chngRecno, 1, -1);
drhcce7d172000-05-31 15:34:51 +0000441 }
442
drh0ca3e242002-01-29 23:07:02 +0000443 /* Increment the row counter
drh1bee3d72001-10-15 00:44:35 +0000444 */
danielk1977c3f9bad2002-05-15 08:30:12 +0000445 if( db->flags & SQLITE_CountRows && !pParse->trigStack){
danielk19774adee202004-05-08 08:23:19 +0000446 sqlite3VdbeAddOp(v, OP_AddImm, 1, 0);
drh1bee3d72001-10-15 00:44:35 +0000447 }
448
drh5cf590c2003-04-24 01:45:04 +0000449 /* If there are triggers, close all the cursors after each iteration
450 ** through the loop. The fire the after triggers.
451 */
drhdca76842004-12-07 14:06:13 +0000452 if( triggers_exist ){
drh5cf590c2003-04-24 01:45:04 +0000453 if( !isView ){
454 for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
455 if( openAll || aIdxUsed[i] )
danielk19774adee202004-05-08 08:23:19 +0000456 sqlite3VdbeAddOp(v, OP_Close, iCur+i+1, 0);
drh5cf590c2003-04-24 01:45:04 +0000457 }
danielk19774adee202004-05-08 08:23:19 +0000458 sqlite3VdbeAddOp(v, OP_Close, iCur, 0);
danielk1977c3f9bad2002-05-15 08:30:12 +0000459 }
drhdca76842004-12-07 14:06:13 +0000460 if( sqlite3CodeRowTrigger(pParse, TK_UPDATE, pChanges, TRIGGER_AFTER, pTab,
danielk19776f349032002-06-11 02:25:40 +0000461 newIdx, oldIdx, onError, addr) ){
danielk1977f29ce552002-05-19 23:43:12 +0000462 goto update_cleanup;
463 }
danielk1977c3f9bad2002-05-15 08:30:12 +0000464 }
465
drhcce7d172000-05-31 15:34:51 +0000466 /* Repeat the above with the next record to be updated, until
467 ** all record selected by the WHERE clause have been updated.
468 */
danielk19774adee202004-05-08 08:23:19 +0000469 sqlite3VdbeAddOp(v, OP_Goto, 0, addr);
470 sqlite3VdbeChangeP2(v, addr, sqlite3VdbeCurrentAddr(v));
471 sqlite3VdbeAddOp(v, OP_ListReset, 0, 0);
danielk1977c3f9bad2002-05-15 08:30:12 +0000472
473 /* Close all tables if there were no FOR EACH ROW triggers */
drhdca76842004-12-07 14:06:13 +0000474 if( !triggers_exist ){
danielk1977c3f9bad2002-05-15 08:30:12 +0000475 for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
476 if( openAll || aIdxUsed[i] ){
danielk19774adee202004-05-08 08:23:19 +0000477 sqlite3VdbeAddOp(v, OP_Close, iCur+i+1, 0);
danielk1977c3f9bad2002-05-15 08:30:12 +0000478 }
479 }
danielk19774adee202004-05-08 08:23:19 +0000480 sqlite3VdbeAddOp(v, OP_Close, iCur, 0);
danielk1977f29ce552002-05-19 23:43:12 +0000481 }else{
danielk19774adee202004-05-08 08:23:19 +0000482 sqlite3VdbeAddOp(v, OP_Close, newIdx, 0);
483 sqlite3VdbeAddOp(v, OP_Close, oldIdx, 0);
danielk1977c3f9bad2002-05-15 08:30:12 +0000484 }
485
drh1bee3d72001-10-15 00:44:35 +0000486 /*
danielk1977e7de6f22004-11-05 06:02:06 +0000487 ** Return the number of rows that were changed. If this routine is
488 ** generating code because of a call to sqlite3NestedParse(), do not
489 ** invoke the callback function.
drh1bee3d72001-10-15 00:44:35 +0000490 */
danielk1977e7de6f22004-11-05 06:02:06 +0000491 if( db->flags & SQLITE_CountRows && !pParse->trigStack && pParse->nested==0 ){
danielk19774adee202004-05-08 08:23:19 +0000492 sqlite3VdbeAddOp(v, OP_Callback, 1, 0);
danielk197722322fd2004-05-25 23:35:17 +0000493 sqlite3VdbeSetNumCols(v, 1);
danielk19773cf86062004-05-26 10:11:05 +0000494 sqlite3VdbeSetColName(v, 0, "rows updated", P3_STATIC);
drh1bee3d72001-10-15 00:44:35 +0000495 }
496
drhcce7d172000-05-31 15:34:51 +0000497update_cleanup:
danielk19774adee202004-05-08 08:23:19 +0000498 sqlite3AuthContextPop(&sContext);
drhcce7d172000-05-31 15:34:51 +0000499 sqliteFree(apIdx);
500 sqliteFree(aXRef);
danielk19774adee202004-05-08 08:23:19 +0000501 sqlite3SrcListDelete(pTabList);
502 sqlite3ExprListDelete(pChanges);
503 sqlite3ExprDelete(pWhere);
drhcce7d172000-05-31 15:34:51 +0000504 return;
505}