Annotation of embedaddon/php/ext/sqlite/libsqlite/src/insert.c, revision 1.1
1.1 ! misho 1: /*
! 2: ** 2001 September 15
! 3: **
! 4: ** The author disclaims copyright to this source code. In place of
! 5: ** a legal notice, here is a blessing:
! 6: **
! 7: ** 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.
! 10: **
! 11: *************************************************************************
! 12: ** This file contains C code routines that are called by the parser
! 13: ** to handle INSERT statements in SQLite.
! 14: **
! 15: ** $Id: insert.c 195361 2005-09-07 15:11:33Z iliaa $
! 16: */
! 17: #include "sqliteInt.h"
! 18:
! 19: /*
! 20: ** This routine is call to handle SQL of the following forms:
! 21: **
! 22: ** insert into TABLE (IDLIST) values(EXPRLIST)
! 23: ** insert into TABLE (IDLIST) select
! 24: **
! 25: ** The IDLIST following the table name is always optional. If omitted,
! 26: ** then a list of all columns for the table is substituted. The IDLIST
! 27: ** appears in the pColumn parameter. pColumn is NULL if IDLIST is omitted.
! 28: **
! 29: ** The pList parameter holds EXPRLIST in the first form of the INSERT
! 30: ** statement above, and pSelect is NULL. For the second form, pList is
! 31: ** NULL and pSelect is a pointer to the select statement used to generate
! 32: ** data for the insert.
! 33: **
! 34: ** The code generated follows one of three templates. For a simple
! 35: ** select with data coming from a VALUES clause, the code executes
! 36: ** once straight down through. The template looks like this:
! 37: **
! 38: ** open write cursor to <table> and its indices
! 39: ** puts VALUES clause expressions onto the stack
! 40: ** write the resulting record into <table>
! 41: ** cleanup
! 42: **
! 43: ** If the statement is of the form
! 44: **
! 45: ** INSERT INTO <table> SELECT ...
! 46: **
! 47: ** And the SELECT clause does not read from <table> at any time, then
! 48: ** the generated code follows this template:
! 49: **
! 50: ** goto B
! 51: ** A: setup for the SELECT
! 52: ** loop over the tables in the SELECT
! 53: ** gosub C
! 54: ** end loop
! 55: ** cleanup after the SELECT
! 56: ** goto D
! 57: ** B: open write cursor to <table> and its indices
! 58: ** goto A
! 59: ** C: insert the select result into <table>
! 60: ** return
! 61: ** D: cleanup
! 62: **
! 63: ** The third template is used if the insert statement takes its
! 64: ** values from a SELECT but the data is being inserted into a table
! 65: ** that is also read as part of the SELECT. In the third form,
! 66: ** we have to use a intermediate table to store the results of
! 67: ** the select. The template is like this:
! 68: **
! 69: ** goto B
! 70: ** A: setup for the SELECT
! 71: ** loop over the tables in the SELECT
! 72: ** gosub C
! 73: ** end loop
! 74: ** cleanup after the SELECT
! 75: ** goto D
! 76: ** C: insert the select result into the intermediate table
! 77: ** return
! 78: ** B: open a cursor to an intermediate table
! 79: ** goto A
! 80: ** D: open write cursor to <table> and its indices
! 81: ** loop over the intermediate table
! 82: ** transfer values form intermediate table into <table>
! 83: ** end the loop
! 84: ** cleanup
! 85: */
! 86: void sqliteInsert(
! 87: Parse *pParse, /* Parser context */
! 88: SrcList *pTabList, /* Name of table into which we are inserting */
! 89: ExprList *pList, /* List of values to be inserted */
! 90: Select *pSelect, /* A SELECT statement to use as the data source */
! 91: IdList *pColumn, /* Column names corresponding to IDLIST. */
! 92: int onError /* How to handle constraint errors */
! 93: ){
! 94: Table *pTab; /* The table to insert into */
! 95: char *zTab; /* Name of the table into which we are inserting */
! 96: const char *zDb; /* Name of the database holding this table */
! 97: int i, j, idx; /* Loop counters */
! 98: Vdbe *v; /* Generate code into this virtual machine */
! 99: Index *pIdx; /* For looping over indices of the table */
! 100: int nColumn; /* Number of columns in the data */
! 101: int base; /* VDBE Cursor number for pTab */
! 102: int iCont, iBreak; /* Beginning and end of the loop over srcTab */
! 103: sqlite *db; /* The main database structure */
! 104: int keyColumn = -1; /* Column that is the INTEGER PRIMARY KEY */
! 105: int endOfLoop; /* Label for the end of the insertion loop */
! 106: int useTempTable; /* Store SELECT results in intermediate table */
! 107: int srcTab; /* Data comes from this temporary cursor if >=0 */
! 108: int iSelectLoop; /* Address of code that implements the SELECT */
! 109: int iCleanup; /* Address of the cleanup code */
! 110: int iInsertBlock; /* Address of the subroutine used to insert data */
! 111: int iCntMem; /* Memory cell used for the row counter */
! 112: int isView; /* True if attempting to insert into a view */
! 113:
! 114: int row_triggers_exist = 0; /* True if there are FOR EACH ROW triggers */
! 115: int before_triggers; /* True if there are BEFORE triggers */
! 116: int after_triggers; /* True if there are AFTER triggers */
! 117: int newIdx = -1; /* Cursor for the NEW table */
! 118:
! 119: if( pParse->nErr || sqlite_malloc_failed ) goto insert_cleanup;
! 120: db = pParse->db;
! 121:
! 122: /* Locate the table into which we will be inserting new information.
! 123: */
! 124: assert( pTabList->nSrc==1 );
! 125: zTab = pTabList->a[0].zName;
! 126: if( zTab==0 ) goto insert_cleanup;
! 127: pTab = sqliteSrcListLookup(pParse, pTabList);
! 128: if( pTab==0 ){
! 129: goto insert_cleanup;
! 130: }
! 131: assert( pTab->iDb<db->nDb );
! 132: zDb = db->aDb[pTab->iDb].zName;
! 133: if( sqliteAuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, zDb) ){
! 134: goto insert_cleanup;
! 135: }
! 136:
! 137: /* Ensure that:
! 138: * (a) the table is not read-only,
! 139: * (b) that if it is a view then ON INSERT triggers exist
! 140: */
! 141: before_triggers = sqliteTriggersExist(pParse, pTab->pTrigger, TK_INSERT,
! 142: TK_BEFORE, TK_ROW, 0);
! 143: after_triggers = sqliteTriggersExist(pParse, pTab->pTrigger, TK_INSERT,
! 144: TK_AFTER, TK_ROW, 0);
! 145: row_triggers_exist = before_triggers || after_triggers;
! 146: isView = pTab->pSelect!=0;
! 147: if( sqliteIsReadOnly(pParse, pTab, before_triggers) ){
! 148: goto insert_cleanup;
! 149: }
! 150: if( pTab==0 ) goto insert_cleanup;
! 151:
! 152: /* If pTab is really a view, make sure it has been initialized.
! 153: */
! 154: if( isView && sqliteViewGetColumnNames(pParse, pTab) ){
! 155: goto insert_cleanup;
! 156: }
! 157:
! 158: /* Allocate a VDBE
! 159: */
! 160: v = sqliteGetVdbe(pParse);
! 161: if( v==0 ) goto insert_cleanup;
! 162: sqliteBeginWriteOperation(pParse, pSelect || row_triggers_exist, pTab->iDb);
! 163:
! 164: /* if there are row triggers, allocate a temp table for new.* references. */
! 165: if( row_triggers_exist ){
! 166: newIdx = pParse->nTab++;
! 167: }
! 168:
! 169: /* Figure out how many columns of data are supplied. If the data
! 170: ** is coming from a SELECT statement, then this step also generates
! 171: ** all the code to implement the SELECT statement and invoke a subroutine
! 172: ** to process each row of the result. (Template 2.) If the SELECT
! 173: ** statement uses the the table that is being inserted into, then the
! 174: ** subroutine is also coded here. That subroutine stores the SELECT
! 175: ** results in a temporary table. (Template 3.)
! 176: */
! 177: if( pSelect ){
! 178: /* Data is coming from a SELECT. Generate code to implement that SELECT
! 179: */
! 180: int rc, iInitCode;
! 181: iInitCode = sqliteVdbeAddOp(v, OP_Goto, 0, 0);
! 182: iSelectLoop = sqliteVdbeCurrentAddr(v);
! 183: iInsertBlock = sqliteVdbeMakeLabel(v);
! 184: rc = sqliteSelect(pParse, pSelect, SRT_Subroutine, iInsertBlock, 0,0,0);
! 185: if( rc || pParse->nErr || sqlite_malloc_failed ) goto insert_cleanup;
! 186: iCleanup = sqliteVdbeMakeLabel(v);
! 187: sqliteVdbeAddOp(v, OP_Goto, 0, iCleanup);
! 188: assert( pSelect->pEList );
! 189: nColumn = pSelect->pEList->nExpr;
! 190:
! 191: /* Set useTempTable to TRUE if the result of the SELECT statement
! 192: ** should be written into a temporary table. Set to FALSE if each
! 193: ** row of the SELECT can be written directly into the result table.
! 194: **
! 195: ** A temp table must be used if the table being updated is also one
! 196: ** of the tables being read by the SELECT statement. Also use a
! 197: ** temp table in the case of row triggers.
! 198: */
! 199: if( row_triggers_exist ){
! 200: useTempTable = 1;
! 201: }else{
! 202: int addr = sqliteVdbeFindOp(v, OP_OpenRead, pTab->tnum);
! 203: useTempTable = 0;
! 204: if( addr>0 ){
! 205: VdbeOp *pOp = sqliteVdbeGetOp(v, addr-2);
! 206: if( pOp->opcode==OP_Integer && pOp->p1==pTab->iDb ){
! 207: useTempTable = 1;
! 208: }
! 209: }
! 210: }
! 211:
! 212: if( useTempTable ){
! 213: /* Generate the subroutine that SELECT calls to process each row of
! 214: ** the result. Store the result in a temporary table
! 215: */
! 216: srcTab = pParse->nTab++;
! 217: sqliteVdbeResolveLabel(v, iInsertBlock);
! 218: sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0);
! 219: sqliteVdbeAddOp(v, OP_NewRecno, srcTab, 0);
! 220: sqliteVdbeAddOp(v, OP_Pull, 1, 0);
! 221: sqliteVdbeAddOp(v, OP_PutIntKey, srcTab, 0);
! 222: sqliteVdbeAddOp(v, OP_Return, 0, 0);
! 223:
! 224: /* The following code runs first because the GOTO at the very top
! 225: ** of the program jumps to it. Create the temporary table, then jump
! 226: ** back up and execute the SELECT code above.
! 227: */
! 228: sqliteVdbeChangeP2(v, iInitCode, sqliteVdbeCurrentAddr(v));
! 229: sqliteVdbeAddOp(v, OP_OpenTemp, srcTab, 0);
! 230: sqliteVdbeAddOp(v, OP_Goto, 0, iSelectLoop);
! 231: sqliteVdbeResolveLabel(v, iCleanup);
! 232: }else{
! 233: sqliteVdbeChangeP2(v, iInitCode, sqliteVdbeCurrentAddr(v));
! 234: }
! 235: }else{
! 236: /* This is the case if the data for the INSERT is coming from a VALUES
! 237: ** clause
! 238: */
! 239: SrcList dummy;
! 240: assert( pList!=0 );
! 241: srcTab = -1;
! 242: useTempTable = 0;
! 243: assert( pList );
! 244: nColumn = pList->nExpr;
! 245: dummy.nSrc = 0;
! 246: for(i=0; i<nColumn; i++){
! 247: if( sqliteExprResolveIds(pParse, &dummy, 0, pList->a[i].pExpr) ){
! 248: goto insert_cleanup;
! 249: }
! 250: if( sqliteExprCheck(pParse, pList->a[i].pExpr, 0, 0) ){
! 251: goto insert_cleanup;
! 252: }
! 253: }
! 254: }
! 255:
! 256: /* Make sure the number of columns in the source data matches the number
! 257: ** of columns to be inserted into the table.
! 258: */
! 259: if( pColumn==0 && nColumn!=pTab->nCol ){
! 260: sqliteErrorMsg(pParse,
! 261: "table %S has %d columns but %d values were supplied",
! 262: pTabList, 0, pTab->nCol, nColumn);
! 263: goto insert_cleanup;
! 264: }
! 265: if( pColumn!=0 && nColumn!=pColumn->nId ){
! 266: sqliteErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId);
! 267: goto insert_cleanup;
! 268: }
! 269:
! 270: /* If the INSERT statement included an IDLIST term, then make sure
! 271: ** all elements of the IDLIST really are columns of the table and
! 272: ** remember the column indices.
! 273: **
! 274: ** If the table has an INTEGER PRIMARY KEY column and that column
! 275: ** is named in the IDLIST, then record in the keyColumn variable
! 276: ** the index into IDLIST of the primary key column. keyColumn is
! 277: ** the index of the primary key as it appears in IDLIST, not as
! 278: ** is appears in the original table. (The index of the primary
! 279: ** key in the original table is pTab->iPKey.)
! 280: */
! 281: if( pColumn ){
! 282: for(i=0; i<pColumn->nId; i++){
! 283: pColumn->a[i].idx = -1;
! 284: }
! 285: for(i=0; i<pColumn->nId; i++){
! 286: for(j=0; j<pTab->nCol; j++){
! 287: if( sqliteStrICmp(pColumn->a[i].zName, pTab->aCol[j].zName)==0 ){
! 288: pColumn->a[i].idx = j;
! 289: if( j==pTab->iPKey ){
! 290: keyColumn = i;
! 291: }
! 292: break;
! 293: }
! 294: }
! 295: if( j>=pTab->nCol ){
! 296: if( sqliteIsRowid(pColumn->a[i].zName) ){
! 297: keyColumn = i;
! 298: }else{
! 299: sqliteErrorMsg(pParse, "table %S has no column named %s",
! 300: pTabList, 0, pColumn->a[i].zName);
! 301: pParse->nErr++;
! 302: goto insert_cleanup;
! 303: }
! 304: }
! 305: }
! 306: }
! 307:
! 308: /* If there is no IDLIST term but the table has an integer primary
! 309: ** key, the set the keyColumn variable to the primary key column index
! 310: ** in the original table definition.
! 311: */
! 312: if( pColumn==0 ){
! 313: keyColumn = pTab->iPKey;
! 314: }
! 315:
! 316: /* Open the temp table for FOR EACH ROW triggers
! 317: */
! 318: if( row_triggers_exist ){
! 319: sqliteVdbeAddOp(v, OP_OpenPseudo, newIdx, 0);
! 320: }
! 321:
! 322: /* Initialize the count of rows to be inserted
! 323: */
! 324: if( db->flags & SQLITE_CountRows ){
! 325: iCntMem = pParse->nMem++;
! 326: sqliteVdbeAddOp(v, OP_Integer, 0, 0);
! 327: sqliteVdbeAddOp(v, OP_MemStore, iCntMem, 1);
! 328: }
! 329:
! 330: /* Open tables and indices if there are no row triggers */
! 331: if( !row_triggers_exist ){
! 332: base = pParse->nTab;
! 333: idx = sqliteOpenTableAndIndices(pParse, pTab, base);
! 334: pParse->nTab += idx;
! 335: }
! 336:
! 337: /* If the data source is a temporary table, then we have to create
! 338: ** a loop because there might be multiple rows of data. If the data
! 339: ** source is a subroutine call from the SELECT statement, then we need
! 340: ** to launch the SELECT statement processing.
! 341: */
! 342: if( useTempTable ){
! 343: iBreak = sqliteVdbeMakeLabel(v);
! 344: sqliteVdbeAddOp(v, OP_Rewind, srcTab, iBreak);
! 345: iCont = sqliteVdbeCurrentAddr(v);
! 346: }else if( pSelect ){
! 347: sqliteVdbeAddOp(v, OP_Goto, 0, iSelectLoop);
! 348: sqliteVdbeResolveLabel(v, iInsertBlock);
! 349: }
! 350:
! 351: /* Run the BEFORE and INSTEAD OF triggers, if there are any
! 352: */
! 353: endOfLoop = sqliteVdbeMakeLabel(v);
! 354: if( before_triggers ){
! 355:
! 356: /* build the NEW.* reference row. Note that if there is an INTEGER
! 357: ** PRIMARY KEY into which a NULL is being inserted, that NULL will be
! 358: ** translated into a unique ID for the row. But on a BEFORE trigger,
! 359: ** we do not know what the unique ID will be (because the insert has
! 360: ** not happened yet) so we substitute a rowid of -1
! 361: */
! 362: if( keyColumn<0 ){
! 363: sqliteVdbeAddOp(v, OP_Integer, -1, 0);
! 364: }else if( useTempTable ){
! 365: sqliteVdbeAddOp(v, OP_Column, srcTab, keyColumn);
! 366: }else if( pSelect ){
! 367: sqliteVdbeAddOp(v, OP_Dup, nColumn - keyColumn - 1, 1);
! 368: }else{
! 369: sqliteExprCode(pParse, pList->a[keyColumn].pExpr);
! 370: sqliteVdbeAddOp(v, OP_NotNull, -1, sqliteVdbeCurrentAddr(v)+3);
! 371: sqliteVdbeAddOp(v, OP_Pop, 1, 0);
! 372: sqliteVdbeAddOp(v, OP_Integer, -1, 0);
! 373: sqliteVdbeAddOp(v, OP_MustBeInt, 0, 0);
! 374: }
! 375:
! 376: /* Create the new column data
! 377: */
! 378: for(i=0; i<pTab->nCol; i++){
! 379: if( pColumn==0 ){
! 380: j = i;
! 381: }else{
! 382: for(j=0; j<pColumn->nId; j++){
! 383: if( pColumn->a[j].idx==i ) break;
! 384: }
! 385: }
! 386: if( pColumn && j>=pColumn->nId ){
! 387: sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[i].zDflt, P3_STATIC);
! 388: }else if( useTempTable ){
! 389: sqliteVdbeAddOp(v, OP_Column, srcTab, j);
! 390: }else if( pSelect ){
! 391: sqliteVdbeAddOp(v, OP_Dup, nColumn-j-1, 1);
! 392: }else{
! 393: sqliteExprCode(pParse, pList->a[j].pExpr);
! 394: }
! 395: }
! 396: sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0);
! 397: sqliteVdbeAddOp(v, OP_PutIntKey, newIdx, 0);
! 398:
! 399: /* Fire BEFORE or INSTEAD OF triggers */
! 400: if( sqliteCodeRowTrigger(pParse, TK_INSERT, 0, TK_BEFORE, pTab,
! 401: newIdx, -1, onError, endOfLoop) ){
! 402: goto insert_cleanup;
! 403: }
! 404: }
! 405:
! 406: /* If any triggers exists, the opening of tables and indices is deferred
! 407: ** until now.
! 408: */
! 409: if( row_triggers_exist && !isView ){
! 410: base = pParse->nTab;
! 411: idx = sqliteOpenTableAndIndices(pParse, pTab, base);
! 412: pParse->nTab += idx;
! 413: }
! 414:
! 415: /* Push the record number for the new entry onto the stack. The
! 416: ** record number is a randomly generate integer created by NewRecno
! 417: ** except when the table has an INTEGER PRIMARY KEY column, in which
! 418: ** case the record number is the same as that column.
! 419: */
! 420: if( !isView ){
! 421: if( keyColumn>=0 ){
! 422: if( useTempTable ){
! 423: sqliteVdbeAddOp(v, OP_Column, srcTab, keyColumn);
! 424: }else if( pSelect ){
! 425: sqliteVdbeAddOp(v, OP_Dup, nColumn - keyColumn - 1, 1);
! 426: }else{
! 427: sqliteExprCode(pParse, pList->a[keyColumn].pExpr);
! 428: }
! 429: /* If the PRIMARY KEY expression is NULL, then use OP_NewRecno
! 430: ** to generate a unique primary key value.
! 431: */
! 432: sqliteVdbeAddOp(v, OP_NotNull, -1, sqliteVdbeCurrentAddr(v)+3);
! 433: sqliteVdbeAddOp(v, OP_Pop, 1, 0);
! 434: sqliteVdbeAddOp(v, OP_NewRecno, base, 0);
! 435: sqliteVdbeAddOp(v, OP_MustBeInt, 0, 0);
! 436: }else{
! 437: sqliteVdbeAddOp(v, OP_NewRecno, base, 0);
! 438: }
! 439:
! 440: /* Push onto the stack, data for all columns of the new entry, beginning
! 441: ** with the first column.
! 442: */
! 443: for(i=0; i<pTab->nCol; i++){
! 444: if( i==pTab->iPKey ){
! 445: /* The value of the INTEGER PRIMARY KEY column is always a NULL.
! 446: ** Whenever this column is read, the record number will be substituted
! 447: ** in its place. So will fill this column with a NULL to avoid
! 448: ** taking up data space with information that will never be used. */
! 449: sqliteVdbeAddOp(v, OP_String, 0, 0);
! 450: continue;
! 451: }
! 452: if( pColumn==0 ){
! 453: j = i;
! 454: }else{
! 455: for(j=0; j<pColumn->nId; j++){
! 456: if( pColumn->a[j].idx==i ) break;
! 457: }
! 458: }
! 459: if( pColumn && j>=pColumn->nId ){
! 460: sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[i].zDflt, P3_STATIC);
! 461: }else if( useTempTable ){
! 462: sqliteVdbeAddOp(v, OP_Column, srcTab, j);
! 463: }else if( pSelect ){
! 464: sqliteVdbeAddOp(v, OP_Dup, i+nColumn-j, 1);
! 465: }else{
! 466: sqliteExprCode(pParse, pList->a[j].pExpr);
! 467: }
! 468: }
! 469:
! 470: /* Generate code to check constraints and generate index keys and
! 471: ** do the insertion.
! 472: */
! 473: sqliteGenerateConstraintChecks(pParse, pTab, base, 0, keyColumn>=0,
! 474: 0, onError, endOfLoop);
! 475: sqliteCompleteInsertion(pParse, pTab, base, 0,0,0,
! 476: after_triggers ? newIdx : -1);
! 477: }
! 478:
! 479: /* Update the count of rows that are inserted
! 480: */
! 481: if( (db->flags & SQLITE_CountRows)!=0 ){
! 482: sqliteVdbeAddOp(v, OP_MemIncr, iCntMem, 0);
! 483: }
! 484:
! 485: if( row_triggers_exist ){
! 486: /* Close all tables opened */
! 487: if( !isView ){
! 488: sqliteVdbeAddOp(v, OP_Close, base, 0);
! 489: for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){
! 490: sqliteVdbeAddOp(v, OP_Close, idx+base, 0);
! 491: }
! 492: }
! 493:
! 494: /* Code AFTER triggers */
! 495: if( sqliteCodeRowTrigger(pParse, TK_INSERT, 0, TK_AFTER, pTab, newIdx, -1,
! 496: onError, endOfLoop) ){
! 497: goto insert_cleanup;
! 498: }
! 499: }
! 500:
! 501: /* The bottom of the loop, if the data source is a SELECT statement
! 502: */
! 503: sqliteVdbeResolveLabel(v, endOfLoop);
! 504: if( useTempTable ){
! 505: sqliteVdbeAddOp(v, OP_Next, srcTab, iCont);
! 506: sqliteVdbeResolveLabel(v, iBreak);
! 507: sqliteVdbeAddOp(v, OP_Close, srcTab, 0);
! 508: }else if( pSelect ){
! 509: sqliteVdbeAddOp(v, OP_Pop, nColumn, 0);
! 510: sqliteVdbeAddOp(v, OP_Return, 0, 0);
! 511: sqliteVdbeResolveLabel(v, iCleanup);
! 512: }
! 513:
! 514: if( !row_triggers_exist ){
! 515: /* Close all tables opened */
! 516: sqliteVdbeAddOp(v, OP_Close, base, 0);
! 517: for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){
! 518: sqliteVdbeAddOp(v, OP_Close, idx+base, 0);
! 519: }
! 520: }
! 521:
! 522: sqliteVdbeAddOp(v, OP_SetCounts, 0, 0);
! 523: sqliteEndWriteOperation(pParse);
! 524:
! 525: /*
! 526: ** Return the number of rows inserted.
! 527: */
! 528: if( db->flags & SQLITE_CountRows ){
! 529: sqliteVdbeOp3(v, OP_ColumnName, 0, 1, "rows inserted", P3_STATIC);
! 530: sqliteVdbeAddOp(v, OP_MemLoad, iCntMem, 0);
! 531: sqliteVdbeAddOp(v, OP_Callback, 1, 0);
! 532: }
! 533:
! 534: insert_cleanup:
! 535: sqliteSrcListDelete(pTabList);
! 536: if( pList ) sqliteExprListDelete(pList);
! 537: if( pSelect ) sqliteSelectDelete(pSelect);
! 538: sqliteIdListDelete(pColumn);
! 539: }
! 540:
! 541: /*
! 542: ** Generate code to do a constraint check prior to an INSERT or an UPDATE.
! 543: **
! 544: ** When this routine is called, the stack contains (from bottom to top)
! 545: ** the following values:
! 546: **
! 547: ** 1. The recno of the row to be updated before the update. This
! 548: ** value is omitted unless we are doing an UPDATE that involves a
! 549: ** change to the record number.
! 550: **
! 551: ** 2. The recno of the row after the update.
! 552: **
! 553: ** 3. The data in the first column of the entry after the update.
! 554: **
! 555: ** i. Data from middle columns...
! 556: **
! 557: ** N. The data in the last column of the entry after the update.
! 558: **
! 559: ** The old recno shown as entry (1) above is omitted unless both isUpdate
! 560: ** and recnoChng are 1. isUpdate is true for UPDATEs and false for
! 561: ** INSERTs and recnoChng is true if the record number is being changed.
! 562: **
! 563: ** The code generated by this routine pushes additional entries onto
! 564: ** the stack which are the keys for new index entries for the new record.
! 565: ** The order of index keys is the same as the order of the indices on
! 566: ** the pTable->pIndex list. A key is only created for index i if
! 567: ** aIdxUsed!=0 and aIdxUsed[i]!=0.
! 568: **
! 569: ** This routine also generates code to check constraints. NOT NULL,
! 570: ** CHECK, and UNIQUE constraints are all checked. If a constraint fails,
! 571: ** then the appropriate action is performed. There are five possible
! 572: ** actions: ROLLBACK, ABORT, FAIL, REPLACE, and IGNORE.
! 573: **
! 574: ** Constraint type Action What Happens
! 575: ** --------------- ---------- ----------------------------------------
! 576: ** any ROLLBACK The current transaction is rolled back and
! 577: ** sqlite_exec() returns immediately with a
! 578: ** return code of SQLITE_CONSTRAINT.
! 579: **
! 580: ** any ABORT Back out changes from the current command
! 581: ** only (do not do a complete rollback) then
! 582: ** cause sqlite_exec() to return immediately
! 583: ** with SQLITE_CONSTRAINT.
! 584: **
! 585: ** any FAIL Sqlite_exec() returns immediately with a
! 586: ** return code of SQLITE_CONSTRAINT. The
! 587: ** transaction is not rolled back and any
! 588: ** prior changes are retained.
! 589: **
! 590: ** any IGNORE The record number and data is popped from
! 591: ** the stack and there is an immediate jump
! 592: ** to label ignoreDest.
! 593: **
! 594: ** NOT NULL REPLACE The NULL value is replace by the default
! 595: ** value for that column. If the default value
! 596: ** is NULL, the action is the same as ABORT.
! 597: **
! 598: ** UNIQUE REPLACE The other row that conflicts with the row
! 599: ** being inserted is removed.
! 600: **
! 601: ** CHECK REPLACE Illegal. The results in an exception.
! 602: **
! 603: ** Which action to take is determined by the overrideError parameter.
! 604: ** Or if overrideError==OE_Default, then the pParse->onError parameter
! 605: ** is used. Or if pParse->onError==OE_Default then the onError value
! 606: ** for the constraint is used.
! 607: **
! 608: ** The calling routine must open a read/write cursor for pTab with
! 609: ** cursor number "base". All indices of pTab must also have open
! 610: ** read/write cursors with cursor number base+i for the i-th cursor.
! 611: ** Except, if there is no possibility of a REPLACE action then
! 612: ** cursors do not need to be open for indices where aIdxUsed[i]==0.
! 613: **
! 614: ** If the isUpdate flag is true, it means that the "base" cursor is
! 615: ** initially pointing to an entry that is being updated. The isUpdate
! 616: ** flag causes extra code to be generated so that the "base" cursor
! 617: ** is still pointing at the same entry after the routine returns.
! 618: ** Without the isUpdate flag, the "base" cursor might be moved.
! 619: */
! 620: void sqliteGenerateConstraintChecks(
! 621: Parse *pParse, /* The parser context */
! 622: Table *pTab, /* the table into which we are inserting */
! 623: int base, /* Index of a read/write cursor pointing at pTab */
! 624: char *aIdxUsed, /* Which indices are used. NULL means all are used */
! 625: int recnoChng, /* True if the record number will change */
! 626: int isUpdate, /* True for UPDATE, False for INSERT */
! 627: int overrideError, /* Override onError to this if not OE_Default */
! 628: int ignoreDest /* Jump to this label on an OE_Ignore resolution */
! 629: ){
! 630: int i;
! 631: Vdbe *v;
! 632: int nCol;
! 633: int onError;
! 634: int addr;
! 635: int extra;
! 636: int iCur;
! 637: Index *pIdx;
! 638: int seenReplace = 0;
! 639: int jumpInst1, jumpInst2;
! 640: int contAddr;
! 641: int hasTwoRecnos = (isUpdate && recnoChng);
! 642:
! 643: v = sqliteGetVdbe(pParse);
! 644: assert( v!=0 );
! 645: assert( pTab->pSelect==0 ); /* This table is not a VIEW */
! 646: nCol = pTab->nCol;
! 647:
! 648: /* Test all NOT NULL constraints.
! 649: */
! 650: for(i=0; i<nCol; i++){
! 651: if( i==pTab->iPKey ){
! 652: continue;
! 653: }
! 654: onError = pTab->aCol[i].notNull;
! 655: if( onError==OE_None ) continue;
! 656: if( overrideError!=OE_Default ){
! 657: onError = overrideError;
! 658: }else if( pParse->db->onError!=OE_Default ){
! 659: onError = pParse->db->onError;
! 660: }else if( onError==OE_Default ){
! 661: onError = OE_Abort;
! 662: }
! 663: if( onError==OE_Replace && pTab->aCol[i].zDflt==0 ){
! 664: onError = OE_Abort;
! 665: }
! 666: sqliteVdbeAddOp(v, OP_Dup, nCol-1-i, 1);
! 667: addr = sqliteVdbeAddOp(v, OP_NotNull, 1, 0);
! 668: switch( onError ){
! 669: case OE_Rollback:
! 670: case OE_Abort:
! 671: case OE_Fail: {
! 672: char *zMsg = 0;
! 673: sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, onError);
! 674: sqliteSetString(&zMsg, pTab->zName, ".", pTab->aCol[i].zName,
! 675: " may not be NULL", (char*)0);
! 676: sqliteVdbeChangeP3(v, -1, zMsg, P3_DYNAMIC);
! 677: break;
! 678: }
! 679: case OE_Ignore: {
! 680: sqliteVdbeAddOp(v, OP_Pop, nCol+1+hasTwoRecnos, 0);
! 681: sqliteVdbeAddOp(v, OP_Goto, 0, ignoreDest);
! 682: break;
! 683: }
! 684: case OE_Replace: {
! 685: sqliteVdbeOp3(v, OP_String, 0, 0, pTab->aCol[i].zDflt, P3_STATIC);
! 686: sqliteVdbeAddOp(v, OP_Push, nCol-i, 0);
! 687: break;
! 688: }
! 689: default: assert(0);
! 690: }
! 691: sqliteVdbeChangeP2(v, addr, sqliteVdbeCurrentAddr(v));
! 692: }
! 693:
! 694: /* Test all CHECK constraints
! 695: */
! 696: /**** TBD ****/
! 697:
! 698: /* If we have an INTEGER PRIMARY KEY, make sure the primary key
! 699: ** of the new record does not previously exist. Except, if this
! 700: ** is an UPDATE and the primary key is not changing, that is OK.
! 701: */
! 702: if( recnoChng ){
! 703: onError = pTab->keyConf;
! 704: if( overrideError!=OE_Default ){
! 705: onError = overrideError;
! 706: }else if( pParse->db->onError!=OE_Default ){
! 707: onError = pParse->db->onError;
! 708: }else if( onError==OE_Default ){
! 709: onError = OE_Abort;
! 710: }
! 711:
! 712: if( isUpdate ){
! 713: sqliteVdbeAddOp(v, OP_Dup, nCol+1, 1);
! 714: sqliteVdbeAddOp(v, OP_Dup, nCol+1, 1);
! 715: jumpInst1 = sqliteVdbeAddOp(v, OP_Eq, 0, 0);
! 716: }
! 717: sqliteVdbeAddOp(v, OP_Dup, nCol, 1);
! 718: jumpInst2 = sqliteVdbeAddOp(v, OP_NotExists, base, 0);
! 719: switch( onError ){
! 720: default: {
! 721: onError = OE_Abort;
! 722: /* Fall thru into the next case */
! 723: }
! 724: case OE_Rollback:
! 725: case OE_Abort:
! 726: case OE_Fail: {
! 727: sqliteVdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError,
! 728: "PRIMARY KEY must be unique", P3_STATIC);
! 729: break;
! 730: }
! 731: case OE_Replace: {
! 732: sqliteGenerateRowIndexDelete(pParse->db, v, pTab, base, 0);
! 733: if( isUpdate ){
! 734: sqliteVdbeAddOp(v, OP_Dup, nCol+hasTwoRecnos, 1);
! 735: sqliteVdbeAddOp(v, OP_MoveTo, base, 0);
! 736: }
! 737: seenReplace = 1;
! 738: break;
! 739: }
! 740: case OE_Ignore: {
! 741: assert( seenReplace==0 );
! 742: sqliteVdbeAddOp(v, OP_Pop, nCol+1+hasTwoRecnos, 0);
! 743: sqliteVdbeAddOp(v, OP_Goto, 0, ignoreDest);
! 744: break;
! 745: }
! 746: }
! 747: contAddr = sqliteVdbeCurrentAddr(v);
! 748: sqliteVdbeChangeP2(v, jumpInst2, contAddr);
! 749: if( isUpdate ){
! 750: sqliteVdbeChangeP2(v, jumpInst1, contAddr);
! 751: sqliteVdbeAddOp(v, OP_Dup, nCol+1, 1);
! 752: sqliteVdbeAddOp(v, OP_MoveTo, base, 0);
! 753: }
! 754: }
! 755:
! 756: /* Test all UNIQUE constraints by creating entries for each UNIQUE
! 757: ** index and making sure that duplicate entries do not already exist.
! 758: ** Add the new records to the indices as we go.
! 759: */
! 760: extra = -1;
! 761: for(iCur=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, iCur++){
! 762: if( aIdxUsed && aIdxUsed[iCur]==0 ) continue; /* Skip unused indices */
! 763: extra++;
! 764:
! 765: /* Create a key for accessing the index entry */
! 766: sqliteVdbeAddOp(v, OP_Dup, nCol+extra, 1);
! 767: for(i=0; i<pIdx->nColumn; i++){
! 768: int idx = pIdx->aiColumn[i];
! 769: if( idx==pTab->iPKey ){
! 770: sqliteVdbeAddOp(v, OP_Dup, i+extra+nCol+1, 1);
! 771: }else{
! 772: sqliteVdbeAddOp(v, OP_Dup, i+extra+nCol-idx, 1);
! 773: }
! 774: }
! 775: jumpInst1 = sqliteVdbeAddOp(v, OP_MakeIdxKey, pIdx->nColumn, 0);
! 776: if( pParse->db->file_format>=4 ) sqliteAddIdxKeyType(v, pIdx);
! 777:
! 778: /* Find out what action to take in case there is an indexing conflict */
! 779: onError = pIdx->onError;
! 780: if( onError==OE_None ) continue; /* pIdx is not a UNIQUE index */
! 781: if( overrideError!=OE_Default ){
! 782: onError = overrideError;
! 783: }else if( pParse->db->onError!=OE_Default ){
! 784: onError = pParse->db->onError;
! 785: }else if( onError==OE_Default ){
! 786: onError = OE_Abort;
! 787: }
! 788: if( seenReplace ){
! 789: if( onError==OE_Ignore ) onError = OE_Replace;
! 790: else if( onError==OE_Fail ) onError = OE_Abort;
! 791: }
! 792:
! 793:
! 794: /* Check to see if the new index entry will be unique */
! 795: sqliteVdbeAddOp(v, OP_Dup, extra+nCol+1+hasTwoRecnos, 1);
! 796: jumpInst2 = sqliteVdbeAddOp(v, OP_IsUnique, base+iCur+1, 0);
! 797:
! 798: /* Generate code that executes if the new index entry is not unique */
! 799: switch( onError ){
! 800: case OE_Rollback:
! 801: case OE_Abort:
! 802: case OE_Fail: {
! 803: int j, n1, n2;
! 804: char zErrMsg[200];
! 805: strcpy(zErrMsg, pIdx->nColumn>1 ? "columns " : "column ");
! 806: n1 = strlen(zErrMsg);
! 807: for(j=0; j<pIdx->nColumn && n1<sizeof(zErrMsg)-30; j++){
! 808: char *zCol = pTab->aCol[pIdx->aiColumn[j]].zName;
! 809: n2 = strlen(zCol);
! 810: if( j>0 ){
! 811: strcpy(&zErrMsg[n1], ", ");
! 812: n1 += 2;
! 813: }
! 814: if( n1+n2>sizeof(zErrMsg)-30 ){
! 815: strcpy(&zErrMsg[n1], "...");
! 816: n1 += 3;
! 817: break;
! 818: }else{
! 819: strcpy(&zErrMsg[n1], zCol);
! 820: n1 += n2;
! 821: }
! 822: }
! 823: strcpy(&zErrMsg[n1],
! 824: pIdx->nColumn>1 ? " are not unique" : " is not unique");
! 825: sqliteVdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, onError, zErrMsg, 0);
! 826: break;
! 827: }
! 828: case OE_Ignore: {
! 829: assert( seenReplace==0 );
! 830: sqliteVdbeAddOp(v, OP_Pop, nCol+extra+3+hasTwoRecnos, 0);
! 831: sqliteVdbeAddOp(v, OP_Goto, 0, ignoreDest);
! 832: break;
! 833: }
! 834: case OE_Replace: {
! 835: sqliteGenerateRowDelete(pParse->db, v, pTab, base, 0);
! 836: if( isUpdate ){
! 837: sqliteVdbeAddOp(v, OP_Dup, nCol+extra+1+hasTwoRecnos, 1);
! 838: sqliteVdbeAddOp(v, OP_MoveTo, base, 0);
! 839: }
! 840: seenReplace = 1;
! 841: break;
! 842: }
! 843: default: assert(0);
! 844: }
! 845: contAddr = sqliteVdbeCurrentAddr(v);
! 846: #if NULL_DISTINCT_FOR_UNIQUE
! 847: sqliteVdbeChangeP2(v, jumpInst1, contAddr);
! 848: #endif
! 849: sqliteVdbeChangeP2(v, jumpInst2, contAddr);
! 850: }
! 851: }
! 852:
! 853: /*
! 854: ** This routine generates code to finish the INSERT or UPDATE operation
! 855: ** that was started by a prior call to sqliteGenerateConstraintChecks.
! 856: ** The stack must contain keys for all active indices followed by data
! 857: ** and the recno for the new entry. This routine creates the new
! 858: ** entries in all indices and in the main table.
! 859: **
! 860: ** The arguments to this routine should be the same as the first six
! 861: ** arguments to sqliteGenerateConstraintChecks.
! 862: */
! 863: void sqliteCompleteInsertion(
! 864: Parse *pParse, /* The parser context */
! 865: Table *pTab, /* the table into which we are inserting */
! 866: int base, /* Index of a read/write cursor pointing at pTab */
! 867: char *aIdxUsed, /* Which indices are used. NULL means all are used */
! 868: int recnoChng, /* True if the record number will change */
! 869: int isUpdate, /* True for UPDATE, False for INSERT */
! 870: int newIdx /* Index of NEW table for triggers. -1 if none */
! 871: ){
! 872: int i;
! 873: Vdbe *v;
! 874: int nIdx;
! 875: Index *pIdx;
! 876:
! 877: v = sqliteGetVdbe(pParse);
! 878: assert( v!=0 );
! 879: assert( pTab->pSelect==0 ); /* This table is not a VIEW */
! 880: for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){}
! 881: for(i=nIdx-1; i>=0; i--){
! 882: if( aIdxUsed && aIdxUsed[i]==0 ) continue;
! 883: sqliteVdbeAddOp(v, OP_IdxPut, base+i+1, 0);
! 884: }
! 885: sqliteVdbeAddOp(v, OP_MakeRecord, pTab->nCol, 0);
! 886: if( newIdx>=0 ){
! 887: sqliteVdbeAddOp(v, OP_Dup, 1, 0);
! 888: sqliteVdbeAddOp(v, OP_Dup, 1, 0);
! 889: sqliteVdbeAddOp(v, OP_PutIntKey, newIdx, 0);
! 890: }
! 891: sqliteVdbeAddOp(v, OP_PutIntKey, base,
! 892: (pParse->trigStack?0:OPFLAG_NCHANGE) |
! 893: (isUpdate?0:OPFLAG_LASTROWID) | OPFLAG_CSCHANGE);
! 894: if( isUpdate && recnoChng ){
! 895: sqliteVdbeAddOp(v, OP_Pop, 1, 0);
! 896: }
! 897: }
! 898:
! 899: /*
! 900: ** Generate code that will open write cursors for a table and for all
! 901: ** indices of that table. The "base" parameter is the cursor number used
! 902: ** for the table. Indices are opened on subsequent cursors.
! 903: **
! 904: ** Return the total number of cursors opened. This is always at least
! 905: ** 1 (for the main table) plus more for each cursor.
! 906: */
! 907: int sqliteOpenTableAndIndices(Parse *pParse, Table *pTab, int base){
! 908: int i;
! 909: Index *pIdx;
! 910: Vdbe *v = sqliteGetVdbe(pParse);
! 911: assert( v!=0 );
! 912: sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
! 913: sqliteVdbeOp3(v, OP_OpenWrite, base, pTab->tnum, pTab->zName, P3_STATIC);
! 914: for(i=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
! 915: sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
! 916: sqliteVdbeOp3(v, OP_OpenWrite, i+base, pIdx->tnum, pIdx->zName, P3_STATIC);
! 917: }
! 918: return i;
! 919: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>