Annotation of embedaddon/php/ext/sqlite/libsqlite/src/insert.c, revision 1.1.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>