15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2001 September 15 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code. In place of 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you do good and not evil. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you find forgiveness for yourself and forgive others. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you share freely, never taking more than you give. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)************************************************************************* 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains C code routines that are called by the parser 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to handle INSERT statements in SQLite. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that will open a table for reading. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3OpenTable( 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *p, /* Generate code into this VDBE */ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCur, /* The cursor number of the table */ 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDb, /* The database index in sqlite3.aDb[] */ 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab, /* The table to be opened */ 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opcode /* OP_OpenRead or OP_OpenWrite */ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IsVirtual(pTab) ) return; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(p); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3TableLock(p, iDb, pTab->tnum, (opcode==OP_OpenWrite)?1:0, pTab->zName); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, opcode, iCur, pTab->tnum, iDb); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, -1, SQLITE_INT_TO_PTR(pTab->nCol), P4_INT32); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "%s", pTab->zName)); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a pointer to the column affinity string associated with index 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pIdx. A column affinity string has one character for each column in 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the table, according to the affinity of the column: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Character Column affinity 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ------------------------------ 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'a' TEXT 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'b' NONE 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'c' NUMERIC 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'd' INTEGER 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'e' REAL 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An extra 'b' is appended to the end of the string to cover the 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** rowid that appears as the last column in every index. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Memory for the buffer containing the column index affinity string 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is managed along with the rest of the Index structure. It will be 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** released when sqlite3DeleteIndex() is called. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pIdx->zColAff ){ 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The first time a column affinity string for a particular index is 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** required, it is allocated and populated here. It is then stored as 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** a member of the Index structure for subsequent use. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The column affinity string will eventually be deleted by 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** sqliteDeleteIndex() when the Index structure itself is cleaned 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** up. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab = pIdx->pTable; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = sqlite3VdbeDb(v); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+2); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pIdx->zColAff ){ 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->mallocFailed = 1; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(n=0; n<pIdx->nColumn; n++){ 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx->zColAff[n] = pTab->aCol[pIdx->aiColumn[n]].affinity; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx->zColAff[n++] = SQLITE_AFF_NONE; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx->zColAff[n] = 0; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pIdx->zColAff; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set P4 of the most recently inserted opcode to a column affinity 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string for table pTab. A column affinity string has one character 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for each column indexed by the index, according to the affinity of the 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** column: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Character Column affinity 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ------------------------------ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'a' TEXT 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'b' NONE 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'c' NUMERIC 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'd' INTEGER 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 'e' REAL 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3TableAffinityStr(Vdbe *v, Table *pTab){ 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The first time a column affinity string for a particular table 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is required, it is allocated and populated here. It is then 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** stored as a member of the Table structure for subsequent use. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The column affinity string will eventually be deleted by 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** sqlite3DeleteTable() when the Table structure itself is cleaned up. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pTab->zColAff ){ 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zColAff; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = sqlite3VdbeDb(v); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !zColAff ){ 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->mallocFailed = 1; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pTab->nCol; i++){ 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zColAff[i] = pTab->aCol[i].affinity; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zColAff[pTab->nCol] = '\0'; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->zColAff = zColAff; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, -1, pTab->zColAff, P4_TRANSIENT); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return non-zero if the table pTab in database iDb or any of its indices 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** have been opened at any point in the VDBE program beginning at location 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** iStartAddr throught the end of the program. This is used to see if 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a statement of the form "INSERT INTO <iDb, pTab> SELECT ..." can 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** run without using temporary table for the results of the SELECT. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int readsTable(Parse *p, int iStartAddr, int iDb, Table *pTab){ 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = sqlite3GetVdbe(p); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iEnd = sqlite3VdbeCurrentAddr(v); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VTable *pVTab = IsVirtual(pTab) ? sqlite3GetVTable(p->db, pTab) : 0; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=iStartAddr; i<iEnd; i++){ 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeOp *pOp = sqlite3VdbeGetOp(v, i); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pOp!=0 ); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOp->opcode==OP_OpenRead && pOp->p3==iDb ){ 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIndex; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tnum = pOp->p2; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tnum==pTab->tnum ){ 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tnum==pIndex->tnum ){ 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOp->opcode==OP_VOpen && pOp->p4.pVtab==pVTab ){ 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pOp->p4.pVtab!=0 ); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pOp->p4type==P4_VTAB ); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINCREMENT 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Locate or create an AutoincInfo structure associated with table pTab 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** which is in database iDb. Return the register number for the register 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that holds the maximum rowid. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There is at most one AutoincInfo structure per table even if the 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** same table is autoincremented multiple times due to inserts within 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** triggers. A new AutoincInfo structure is created if this is the 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** first use of table pTab. On 2nd and subsequent uses, the original 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** AutoincInfo structure is used. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Three memory locations are allocated: 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (1) Register to hold the name of the pTab table. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (2) Register to hold the maximum ROWID of pTab. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (3) Register to hold the rowid in sqlite_sequence of pTab 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The 2nd register is the one that is returned. That is all the 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** insert routine needs to know about. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int autoIncBegin( 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDb, /* Index of the database holding pTab */ 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab /* The table we are writing to */ 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int memId = 0; /* Register holding maximum rowid */ 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab->tabFlags & TF_Autoincrement ){ 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pToplevel = sqlite3ParseToplevel(pParse); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutoincInfo *pInfo; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo = pToplevel->pAinc; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pInfo==0 ){ 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo = sqlite3DbMallocRaw(pParse->db, sizeof(*pInfo)); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pInfo==0 ) return 0; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->pNext = pToplevel->pAinc; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pToplevel->pAinc = pInfo; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->pTab = pTab; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->iDb = iDb; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pToplevel->nMem++; /* Register to hold name of table */ 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->regCtr = ++pToplevel->nMem; /* Max rowid register */ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pToplevel->nMem++; /* Rowid in sqlite_sequence */ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memId = pInfo->regCtr; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return memId; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine generates code that will initialize all of the 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register used by the autoincrement tracker. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3AutoincrementBegin(Parse *pParse){ 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutoincInfo *p; /* Information about an AUTOINCREMENT */ 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; /* The database connection */ 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Db *pDb; /* Database only autoinc table */ 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int memId; /* Register holding max rowid */ 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr; /* A VDBE address */ 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; /* VDBE under construction */ 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This routine is never called during trigger-generation. It is 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** only called from the top-level */ 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParse->pTriggerTab==0 ); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParse==sqlite3ParseToplevel(pParse) ); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( v ); /* We failed long ago if this is not so */ 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(p = pParse->pAinc; p; p = p->pNext){ 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDb = &db->aDb[p->iDb]; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memId = p->regCtr; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenRead); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeCurrentAddr(v); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, memId-1, 0, p->pTab->zName, 0); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Rewind, 0, addr+9); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Column, 0, 0, memId); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Ne, memId-1, addr+7, memId); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Rowid, 0, memId+1); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Column, 0, 1, memId); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, addr+9); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Next, 0, addr+2); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, memId); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp0(v, OP_Close); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Update the maximum rowid for an autoincrement calculation. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine should be called when the top of the stack holds a 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** new rowid that is about to be inserted. If that new rowid is 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** larger than the maximum rowid in the memId memory cell, then the 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** memory cell is updated. The stack is unchanged. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void autoIncStep(Parse *pParse, int memId, int regRowid){ 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( memId>0 ){ 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(pParse->pVdbe, OP_MemMax, memId, regRowid); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine generates the code needed to write autoincrement 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** maximum rowid values back into the sqlite_sequence register. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Every statement that might do an INSERT into an autoincrement 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table (either directly or through triggers) needs to call this 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routine just before the "exit" code. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3AutoincrementEnd(Parse *pParse){ 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutoincInfo *p; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( v ); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(p = pParse->pAinc; p; p = p->pNext){ 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Db *pDb = &db->aDb[p->iDb]; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j1, j2, j3, j4, j5; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iRec; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int memId = p->regCtr; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iRec = sqlite3GetTempReg(pParse); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j1 = sqlite3VdbeAddOp1(v, OP_NotNull, memId+1); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j2 = sqlite3VdbeAddOp0(v, OP_Rewind); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j3 = sqlite3VdbeAddOp3(v, OP_Column, 0, 0, iRec); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j4 = sqlite3VdbeAddOp3(v, OP_Eq, memId-1, 0, iRec); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Next, 0, j3); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j2); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_NewRowid, 0, memId+1); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j5 = sqlite3VdbeAddOp0(v, OP_Goto); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j4); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Rowid, 0, memId+1); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j1); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j5); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MakeRecord, memId-1, 2, iRec); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Insert, 0, iRec, memId+1); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, OPFLAG_APPEND); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp0(v, OP_Close); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, iRec); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If SQLITE_OMIT_AUTOINCREMENT is defined, then the three routines 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** above are all no-ops 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define autoIncBegin(A,B,C) (0) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define autoIncStep(A,B,C) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_AUTOINCREMENT */ 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Forward declaration */ 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xferOptimization( 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parser context */ 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pDest, /* The table we are inserting into */ 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSelect, /* A SELECT statement to use as the data source */ 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int onError, /* How to handle constraint errors */ 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDbDest /* The database of pDest */ 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is call to handle SQL of the following forms: 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** insert into TABLE (IDLIST) values(EXPRLIST) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** insert into TABLE (IDLIST) select 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The IDLIST following the table name is always optional. If omitted, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then a list of all columns for the table is substituted. The IDLIST 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** appears in the pColumn parameter. pColumn is NULL if IDLIST is omitted. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The pList parameter holds EXPRLIST in the first form of the INSERT 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** statement above, and pSelect is NULL. For the second form, pList is 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL and pSelect is a pointer to the select statement used to generate 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** data for the insert. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The code generated follows one of four templates. For a simple 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** select with data coming from a VALUES clause, the code executes 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** once straight down through. Pseudo-code follows (we call this 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the "1st template"): 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** open write cursor to <table> and its indices 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** puts VALUES clause expressions onto the stack 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** write the resulting record into <table> 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cleanup 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The three remaining templates assume the statement is of the form 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** INSERT INTO <table> SELECT ... 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the SELECT clause is of the restricted form "SELECT * FROM <table2>" - 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in other words if the SELECT pulls all columns from a single table 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and there is no WHERE or LIMIT or GROUP BY or ORDER BY clauses, and 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if <table2> and <table1> are distinct tables but have identical 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** schemas, including all the same indices, then a special optimization 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is invoked that copies raw records from <table2> over to <table1>. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See the xferOptimization() function for the implementation of this 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** template. This is the 2nd template. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** open a write cursor to <table> 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** open read cursor on <table2> 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** transfer all records in <table2> over to <table> 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** close cursors 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** foreach index on <table> 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** open a write cursor on the <table> index 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** open a read cursor on the corresponding <table2> index 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** transfer all records from the read to the write cursors 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** close cursors 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** end foreach 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The 3rd template is for when the second template does not apply 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and the SELECT clause does not read from <table> at any time. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The generated code follows this template: 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EOF <- 0 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** X <- A 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** goto B 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A: setup for the SELECT 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** loop over the rows in the SELECT 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** load values into registers R..R+n 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yield X 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** end loop 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cleanup after the SELECT 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EOF <- 1 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yield X 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** goto A 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** B: open write cursor to <table> and its indices 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** C: yield X 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if EOF goto D 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** insert the select result into <table> from R..R+n 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** goto C 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** D: cleanup 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The 4th template is used if the insert statement takes its 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** values from a SELECT but the data is being inserted into a table 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that is also read as part of the SELECT. In the third form, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** we have to use a intermediate table to store the results of 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the select. The template is like this: 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EOF <- 0 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** X <- A 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** goto B 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A: setup for the SELECT 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** loop over the tables in the SELECT 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** load value into register R..R+n 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yield X 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** end loop 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cleanup after the SELECT 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EOF <- 1 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yield X 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** halt-error 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** B: open temp table 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** L: yield X 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if EOF goto M 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** insert row from R..R+n into temp table 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** goto L 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** M: open write cursor to <table> and its indices 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** rewind temp table 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** C: loop over rows of intermediate table 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** transfer values form intermediate table into <table> 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** end loop 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** D: cleanup 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3Insert( 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parser context */ 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pTabList, /* Name of table into which we are inserting */ 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList, /* List of values to be inserted */ 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSelect, /* A SELECT statement to use as the data source */ 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IdList *pColumn, /* Column names corresponding to IDLIST. */ 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int onError /* How to handle constraint errors */ 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; /* The main database structure */ 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; /* The table to insert into. aka TABLE */ 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zTab; /* Name of the table into which we are inserting */ 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zDb; /* Name of the database holding this table */ 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j, idx; /* Loop counters */ 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; /* Generate code into this virtual machine */ 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx; /* For looping over indices of the table */ 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nColumn; /* Number of columns in the data */ 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nHidden = 0; /* Number of hidden columns if TABLE is virtual */ 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int baseCur = 0; /* VDBE Cursor number for pTab */ 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int keyColumn = -1; /* Column that is the INTEGER PRIMARY KEY */ 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int endOfLoop; /* Label for the end of the insertion loop */ 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int useTempTable = 0; /* Store SELECT results in intermediate table */ 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int srcTab = 0; /* Data comes from this temporary cursor if >=0 */ 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrInsTop = 0; /* Jump to label "D" */ 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrCont = 0; /* Top of insert loop. Label "C" in templates 3 and 4 */ 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrSelect = 0; /* Address of coroutine that implements the SELECT */ 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest dest; /* Destination for SELECT on rhs of INSERT */ 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDb; /* Index of database holding TABLE */ 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Db *pDb; /* The database containing table being inserted into */ 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int appendFlag = 0; /* True if the insert is likely to be an append */ 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Register allocations */ 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regFromSelect = 0;/* Base register for data coming from SELECT */ 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regAutoinc = 0; /* Register holding the AUTOINCREMENT counter */ 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regRowCount = 0; /* Memory cell used for the row counter */ 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regIns; /* Block of regs holding rowid+data being inserted */ 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regRowid; /* registers holding insert rowid */ 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regData; /* register holding first column to insert */ 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regEof = 0; /* Register recording end of SELECT data */ 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *aRegIdx = 0; /* One register allocated to each index */ 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRIGGER 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isView; /* True if attempting to insert into a view */ 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Trigger *pTrigger; /* List of triggers on pTab, if required */ 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tmask; /* Mask of trigger times */ 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = pParse->db; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&dest, 0, sizeof(dest)); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nErr || db->mallocFailed ){ 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_cleanup; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Locate the table into which we will be inserting new information. 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTabList->nSrc==1 ); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zTab = pTabList->a[0].zName; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(zTab==0) ) goto insert_cleanup; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = sqlite3SrcListLookup(pParse, pTabList); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab==0 ){ 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_cleanup; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iDb = sqlite3SchemaToIndex(db, pTab->pSchema); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iDb<db->nDb ); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDb = &db->aDb[iDb]; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zDb = pDb->zName; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, zDb) ){ 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_cleanup; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Figure out if we have any triggers and if the table being 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** inserted into is a view 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRIGGER 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTrigger = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0, &tmask); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isView = pTab->pSelect!=0; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define pTrigger 0 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define tmask 0 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define isView 0 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_VIEW 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# undef isView 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define isView 0 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (pTrigger && tmask) || (pTrigger==0 && tmask==0) ); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If pTab is really a view, make sure it has been initialized. 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** ViewGetColumnNames() is a no-op if pTab is not a view (or virtual 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** module table). 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ViewGetColumnNames(pParse, pTab) ){ 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_cleanup; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Ensure that: 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (a) the table is not read-only, 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (b) that if it is a view then ON INSERT triggers exist 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_cleanup; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Allocate a VDBE 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(pParse); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( v==0 ) goto insert_cleanup; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3BeginWriteOperation(pParse, pSelect || pTrigger, iDb); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_XFER_OPT 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the statement is of the form 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** INSERT INTO <table1> SELECT * FROM <table2>; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Then special optimizations can be applied that make the transfer 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** very fast and which reduce fragmentation of indices. 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This is the 2nd template. 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){ 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !pTrigger ); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pList==0 ); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_end; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_XFER_OPT */ 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If this is an AUTOINCREMENT table, look up the sequence number in the 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** sqlite_sequence table and store it in memory cell regAutoinc. 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regAutoinc = autoIncBegin(pParse, iDb, pTab); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Figure out how many columns of data are supplied. If the data 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is coming from a SELECT statement, then generate a co-routine that 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** produces a single row of the SELECT on each invocation. The 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** co-routine is the common header to the 3rd and 4th templates. 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect ){ 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Data is coming from a SELECT. Generate code to implement that SELECT 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** as a co-routine. The code is common to both the 3rd and 4th 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** templates: 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** EOF <- 0 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** X <- A 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** goto B 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** A: setup for the SELECT 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** loop over the tables in the SELECT 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** load value into register R..R+n 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** yield X 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** end loop 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** cleanup after the SELECT 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** EOF <- 1 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** yield X 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** halt-error 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** On each invocation of the co-routine, it puts a single row of the 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT result into registers dest.iMem...dest.iMem+dest.nMem-1. 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** (These output registers are allocated by sqlite3Select().) When 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the SELECT completes, it sets the EOF flag stored in regEof. 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc, j1; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regEof = ++pParse->nMem; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, regEof); /* EOF <- 0 */ 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "SELECT eof flag")); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDestInit(&dest, SRT_Coroutine, ++pParse->nMem); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrSelect = sqlite3VdbeCurrentAddr(v)+2; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, addrSelect-1, dest.iParm); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j1 = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "Jump over SELECT coroutine")); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Resolve the expressions in the SELECT statement and execute it. */ 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3Select(pParse, pSelect, &dest); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParse->nErr==0 || rc ); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc || NEVER(pParse->nErr) || db->mallocFailed ){ 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_cleanup; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, regEof); /* EOF <- 1 */ 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Yield, dest.iParm); /* yield X */ 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_INTERNAL, OE_Abort); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "End of SELECT coroutine")); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j1); /* label B: */ 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regFromSelect = dest.iMem; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSelect->pEList ); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nColumn = pSelect->pEList->nExpr; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( dest.nMem==nColumn ); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Set useTempTable to TRUE if the result of the SELECT statement 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** should be written into a temporary table (template 4). Set to 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** FALSE if each* row of the SELECT can be written directly into 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the destination table (template 3). 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** A temp table must be used if the table being updated is also one 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of the tables being read by the SELECT statement. Also use a 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** temp table in the case of row triggers. 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTrigger || readsTable(pParse, addrSelect, iDb, pTab) ){ 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) useTempTable = 1; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( useTempTable ){ 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Invoke the coroutine to extract information from the SELECT 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** and add it to a transient table srcTab. The code generated 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** here is from the 4th template: 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** B: open temp table 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** L: yield X 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** if EOF goto M 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** insert row from R..R+n into temp table 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** goto L 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** M: ... 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regRec; /* Register to hold packed record */ 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regTempRowid; /* Register to hold temp table ROWID */ 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrTop; /* Label "L" */ 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrIf; /* Address of jump to M */ 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srcTab = pParse->nTab++; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regRec = sqlite3GetTempReg(pParse); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regTempRowid = sqlite3GetTempReg(pParse); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_OpenEphemeral, srcTab, nColumn); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrTop = sqlite3VdbeAddOp1(v, OP_Yield, dest.iParm); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrIf = sqlite3VdbeAddOp1(v, OP_If, regEof); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MakeRecord, regFromSelect, nColumn, regRec); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_NewRowid, srcTab, regTempRowid); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Insert, srcTab, regRec, regTempRowid); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, addrTop); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addrIf); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regRec); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regTempRowid); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This is the case if the data for the INSERT is coming from a VALUES 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** clause 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext sNC; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&sNC, 0, sizeof(sNC)); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pParse = pParse; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srcTab = -1; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( useTempTable==0 ); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nColumn = pList ? pList->nExpr : 0; 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nColumn; i++){ 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ResolveExprNames(&sNC, pList->a[i].pExpr) ){ 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_cleanup; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Make sure the number of columns in the source data matches the number 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of columns to be inserted into the table. 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IsVirtual(pTab) ){ 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pTab->nCol; i++){ 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "table %S has %d columns but %d values were supplied", 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTabList, 0, pTab->nCol-nHidden, nColumn); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_cleanup; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColumn!=0 && nColumn!=pColumn->nId ){ 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_cleanup; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the INSERT statement included an IDLIST term, then make sure 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** all elements of the IDLIST really are columns of the table and 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** remember the column indices. 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If the table has an INTEGER PRIMARY KEY column and that column 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is named in the IDLIST, then record in the keyColumn variable 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the index into IDLIST of the primary key column. keyColumn is 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the index of the primary key as it appears in IDLIST, not as 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is appears in the original table. (The index of the primary 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** key in the original table is pTab->iPKey.) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColumn ){ 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pColumn->nId; i++){ 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColumn->a[i].idx = -1; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pColumn->nId; i++){ 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<pTab->nCol; j++){ 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zName)==0 ){ 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColumn->a[i].idx = j; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( j==pTab->iPKey ){ 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyColumn = i; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( j>=pTab->nCol ){ 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3IsRowid(pColumn->a[i].zName) ){ 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyColumn = i; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "table %S has no column named %s", 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTabList, 0, pColumn->a[i].zName); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->checkSchema = 1; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_cleanup; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If there is no IDLIST term but the table has an integer primary 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** key, the set the keyColumn variable to the primary key column index 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in the original table definition. 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColumn==0 && nColumn>0 ){ 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyColumn = pTab->iPKey; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Initialize the count of rows to be inserted 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->flags & SQLITE_CountRows ){ 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regRowCount = ++pParse->nMem; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If this is not a view, open the table and and all indices */ 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !isView ){ 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nIdx; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) baseCur = pParse->nTab; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nIdx = sqlite3OpenTableAndIndices(pParse, pTab, baseCur, OP_OpenWrite); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aRegIdx = sqlite3DbMallocRaw(db, sizeof(int)*(nIdx+1)); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( aRegIdx==0 ){ 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto insert_cleanup; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nIdx; i++){ 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aRegIdx[i] = ++pParse->nMem; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This is the top of the main insertion loop */ 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( useTempTable ){ 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This block codes the top of loop only. The complete loop is the 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** following pseudocode (template 4): 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** rewind temp table 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** C: loop over rows of intermediate table 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** transfer values form intermediate table into <table> 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** end loop 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** D: ... 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrInsTop = sqlite3VdbeAddOp1(v, OP_Rewind, srcTab); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrCont = sqlite3VdbeCurrentAddr(v); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pSelect ){ 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This block codes the top of loop only. The complete loop is the 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** following pseudocode (template 3): 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** C: yield X 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** if EOF goto D 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** insert the select result into <table> from R..R+n 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** goto C 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** D: ... 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iParm); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrInsTop = sqlite3VdbeAddOp1(v, OP_If, regEof); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Allocate registers for holding the rowid of the new row, 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the content of the new row, and the assemblied row record. 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regRowid = regIns = pParse->nMem+1; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem += pTab->nCol + 1; 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IsVirtual(pTab) ){ 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regRowid++; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem++; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regData = regRowid+1; 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Run the BEFORE and INSTEAD OF triggers, if there are any 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) endOfLoop = sqlite3VdbeMakeLabel(v); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tmask & TRIGGER_BEFORE ){ 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* build the NEW.* reference row. Note that if there is an INTEGER 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** PRIMARY KEY into which a NULL is being inserted, that NULL will be 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** translated into a unique ID for the row. But on a BEFORE trigger, 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** we do not know what the unique ID will be (because the insert has 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** not happened yet) so we substitute a rowid of -1 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( keyColumn<0 ){ 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j1; 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( useTempTable ){ 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Column, srcTab, keyColumn, regCols); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSelect==0 ); /* Otherwise useTempTable is true */ 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr, regCols); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j1); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Cannot have triggers on a virtual table. If it were possible, 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** this block would have to account for hidden column. 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !IsVirtual(pTab) ); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Create the new column data 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pTab->nCol; i++){ 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColumn==0 ){ 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j = i; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<pColumn->nId; j++){ 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColumn->a[j].idx==i ) break; 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (!useTempTable && !pList) || (pColumn && j>=pColumn->nId) ){ 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regCols+i+1); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( useTempTable ){ 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, regCols+i+1); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSelect==0 ); /* Otherwise useTempTable is true */ 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr, regCols+i+1); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** do not attempt any conversions before assembling the record. 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If this is a real table, attempt conversions as required by the 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** table column affinities. 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !isView ){ 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Affinity, regCols+1, pTab->nCol); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3TableAffinityStr(v, pTab); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Fire BEFORE or INSTEAD OF triggers */ 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_BEFORE, 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab, regCols-pTab->nCol-1, onError, endOfLoop); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol+1); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Push the record number for the new entry onto the stack. The 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** record number is a randomly generate integer created by NewRowid 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** except when the table has an INTEGER PRIMARY KEY column, in which 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** case the record number is the same as that column. 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !isView ){ 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IsVirtual(pTab) ){ 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The row that the VUpdate opcode will delete: none */ 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, regIns); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( keyColumn>=0 ){ 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( useTempTable ){ 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Column, srcTab, keyColumn, regRowid); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pSelect ){ 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+keyColumn, regRowid); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeOp *pOp; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr, regRowid); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOp = sqlite3VdbeGetOp(v, -1); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(pOp) && pOp->opcode==OP_Null && !IsVirtual(pTab) ){ 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) appendFlag = 1; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOp->opcode = OP_NewRowid; 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOp->p1 = baseCur; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOp->p2 = regRowid; 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOp->p3 = regAutoinc; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to generate a unique primary key value. 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !appendFlag ){ 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j1; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !IsVirtual(pTab) ){ 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_NewRowid, baseCur, regRowid, regAutoinc); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j1); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j1 = sqlite3VdbeCurrentAddr(v); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, j1+2); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( IsVirtual(pTab) ){ 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, regRowid); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_NewRowid, baseCur, regRowid, regAutoinc); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) appendFlag = 1; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autoIncStep(pParse, regAutoinc, regRowid); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Push onto the stack, data for all columns of the new entry, beginning 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** with the first column. 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nHidden = 0; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pTab->nCol; i++){ 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iRegStore = regRowid+1+i; 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i==pTab->iPKey ){ 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The value of the INTEGER PRIMARY KEY column is always a NULL. 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Whenever this column is read, the record number will be substituted 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in its place. So will fill this column with a NULL to avoid 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** taking up data space with information that will never be used. */ 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, iRegStore); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColumn==0 ){ 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IsHiddenColumn(&pTab->aCol[i]) ){ 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( IsVirtual(pTab) ); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j = -1; 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nHidden++; 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j = i - nHidden; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<pColumn->nId; j++){ 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColumn->a[j].idx==i ) break; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( j<0 || nColumn==0 || (pColumn && j>=pColumn->nId) ){ 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, iRegStore); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( useTempTable ){ 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, iRegStore); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pSelect ){ 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+j, iRegStore); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pList->a[j].pExpr, iRegStore); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate code to check constraints and generate index keys and 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** do the insertion. 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IsVirtual(pTab) ){ 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VtabMakeWritable(pParse, pTab); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_VUpdate, 1, pTab->nCol+2, regIns, pVTab, P4_VTAB); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3MayAbort(pParse); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isReplace; /* Set to true if constraints may cause a replace */ 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3GenerateConstraintChecks(pParse, pTab, baseCur, regIns, aRegIdx, 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyColumn>=0, 0, onError, endOfLoop, &isReplace 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3FkCheck(pParse, pTab, 0, regIns); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3CompleteInsertion( 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse, pTab, baseCur, regIns, aRegIdx, 0, appendFlag, isReplace==0 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Update the count of rows that are inserted 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (db->flags & SQLITE_CountRows)!=0 ){ 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTrigger ){ 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Code AFTER triggers */ 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_AFTER, 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab, regData-2-pTab->nCol, onError, endOfLoop); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The bottom of the main insertion loop, if the data source 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is a SELECT statement. 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, endOfLoop); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( useTempTable ){ 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Next, srcTab, addrCont); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addrInsTop); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Close, srcTab); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pSelect ){ 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, addrCont); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addrInsTop); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !IsVirtual(pTab) && !isView ){ 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Close all tables opened */ 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Close, baseCur); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){ 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Close, idx+baseCur); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)insert_end: 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Update the sqlite_sequence table by storing the content of the 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** maximum rowid counter values recorded while inserting into 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** autoincrement tables. 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nested==0 && pParse->pTriggerTab==0 ){ 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3AutoincrementEnd(pParse); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Return the number of rows inserted. If this routine is 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** generating code because of a call to sqlite3NestedParse(), do not 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** invoke the callback function. 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){ 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, 1); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", SQLITE_STATIC); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)insert_cleanup: 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SrcListDelete(db, pTabList); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, pList); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDelete(db, pSelect); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3IdListDelete(db, pColumn); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, aRegIdx); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Make sure "isView" and other macros defined above are undefined. Otherwise 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** thely may interfere with compilation of other functions in this file 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (or in another file, if this file becomes part of the amalgamation). */ 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef isView 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #undef isView 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef pTrigger 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #undef pTrigger 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef tmask 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #undef tmask 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code to do constraint checks prior to an INSERT or an UPDATE. 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The input is a range of consecutive registers as follows: 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1. The rowid of the row after the update. 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2. The data in the first column of the entry after the update. 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** i. Data from middle columns... 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** N. The data in the last column of the entry after the update. 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The regRowid parameter is the index of the register containing (1). 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If isUpdate is true and rowidChng is non-zero, then rowidChng contains 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the address of a register containing the rowid before the update takes 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** place. isUpdate is true for UPDATEs and false for INSERTs. If isUpdate 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is false, indicating an INSERT statement, then a non-zero rowidChng 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** indicates that the rowid was explicitly specified as part of the 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** INSERT statement. If rowidChng is false, it means that the rowid is 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** computed automatically in an insert or that the rowid value is not 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** modified by an update. 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The code generated by this routine store new index entries into 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** registers identified by aRegIdx[]. No index entry is created for 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** indices where aRegIdx[i]==0. The order of indices in aRegIdx[] is 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the same as the order of indices on the linked list of indices 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** attached to the table. 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine also generates code to check constraints. NOT NULL, 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** CHECK, and UNIQUE constraints are all checked. If a constraint fails, 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then the appropriate action is performed. There are five possible 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** actions: ROLLBACK, ABORT, FAIL, REPLACE, and IGNORE. 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Constraint type Action What Happens 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** --------------- ---------- ---------------------------------------- 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** any ROLLBACK The current transaction is rolled back and 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_exec() returns immediately with a 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return code of SQLITE_CONSTRAINT. 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** any ABORT Back out changes from the current command 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** only (do not do a complete rollback) then 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cause sqlite3_exec() to return immediately 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with SQLITE_CONSTRAINT. 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** any FAIL Sqlite_exec() returns immediately with a 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return code of SQLITE_CONSTRAINT. The 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** transaction is not rolled back and any 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** prior changes are retained. 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** any IGNORE The record number and data is popped from 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the stack and there is an immediate jump 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to label ignoreDest. 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NOT NULL REPLACE The NULL value is replace by the default 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value for that column. If the default value 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is NULL, the action is the same as ABORT. 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** UNIQUE REPLACE The other row that conflicts with the row 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** being inserted is removed. 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** CHECK REPLACE Illegal. The results in an exception. 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Which action to take is determined by the overrideError parameter. 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Or if overrideError==OE_Default, then the pParse->onError parameter 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is used. Or if pParse->onError==OE_Default then the onError value 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for the constraint is used. 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The calling routine must open a read/write cursor for pTab with 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cursor number "baseCur". All indices of pTab must also have open 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** read/write cursors with cursor number baseCur+i for the i-th cursor. 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Except, if there is no possibility of a REPLACE action then 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cursors do not need to be open for indices where aRegIdx[i]==0. 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3GenerateConstraintChecks( 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* The parser context */ 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab, /* the table into which we are inserting */ 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int baseCur, /* Index of a read/write cursor pointing at pTab */ 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regRowid, /* Index of the range of input registers */ 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *aRegIdx, /* Register used by each index. 0 for unused indices */ 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowidChng, /* True if the rowid might collide with existing entry */ 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isUpdate, /* True for UPDATE, False for INSERT */ 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int overrideError, /* Override onError to this if not OE_Default */ 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ignoreDest, /* Jump to this label on an OE_Ignore resolution */ 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *pbMayReplace /* OUT: Set to true if constraint may cause a replace */ 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* loop counter */ 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; /* VDBE under constrution */ 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nCol; /* Number of columns */ 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int onError; /* Conflict resolution strategy */ 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j1; /* Addresss of jump instruction */ 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j2 = 0, j3; /* Addresses of jump instructions */ 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regData; /* Register containing first data column */ 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCur; /* Table cursor number */ 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx; /* Pointer to one of the indices */ 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */ 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regOldRowid = (rowidChng && isUpdate) ? rowidChng : regRowid; 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(pParse); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( v!=0 ); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTab->pSelect==0 ); /* This table is not a VIEW */ 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nCol = pTab->nCol; 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regData = regRowid + 1; 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Test all NOT NULL constraints. 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nCol; i++){ 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i==pTab->iPKey ){ 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = pTab->aCol[i].notNull; 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( onError==OE_None ) continue; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( overrideError!=OE_Default ){ 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = overrideError; 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( onError==OE_Default ){ 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = OE_Abort; 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){ 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = OE_Abort; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || onError==OE_Ignore || onError==OE_Replace ); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( onError ){ 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Abort: 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3MayAbort(pParse); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Rollback: 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Fail: { 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zMsg; 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_HaltIfNull, 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQLITE_CONSTRAINT, onError, regData+i); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zMsg = sqlite3MPrintf(pParse->db, "%s.%s may not be NULL", 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->zName, pTab->aCol[i].zName); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, -1, zMsg, P4_DYNAMIC); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Ignore: { 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IsNull, regData+i, ignoreDest); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( onError==OE_Replace ); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regData+i); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regData+i); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j1); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Test all CHECK constraints 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CHECK 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab->pCheck && (pParse->db->flags & SQLITE_IgnoreChecks)==0 ){ 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int allOk = sqlite3VdbeMakeLabel(v); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->ckBase = regData; 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfTrue(pParse, pTab->pCheck, allOk, SQLITE_JUMPIFNULL); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = overrideError!=OE_Default ? overrideError : OE_Abort; 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( onError==OE_Ignore ){ 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-15569-63625 */ 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3HaltConstraint(pParse, onError, 0, 0); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, allOk); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_CHECK) */ 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we have an INTEGER PRIMARY KEY, make sure the primary key 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of the new record does not previously exist. Except, if this 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is an UPDATE and the primary key is not changing, that is OK. 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rowidChng ){ 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = pTab->keyConf; 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( overrideError!=OE_Default ){ 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = overrideError; 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( onError==OE_Default ){ 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = OE_Abort; 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isUpdate ){ 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j2 = sqlite3VdbeAddOp3(v, OP_Eq, regRowid, 0, rowidChng); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j3 = sqlite3VdbeAddOp3(v, OP_NotExists, baseCur, 0, regRowid); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( onError ){ 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = OE_Abort; 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Fall thru into the next case */ 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Rollback: 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Abort: 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Fail: { 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3HaltConstraint( 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse, onError, "PRIMARY KEY must be unique", P4_STATIC); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Replace: { 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If there are DELETE triggers on this table and the 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** recursive-triggers flag is set, call GenerateRowDelete() to 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** remove the conflicting row from the the table. This will fire 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the triggers and remove both the table and index b-tree entries. 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Otherwise, if there are no triggers or the recursive-triggers 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** flag is not set, but the table has one or more indexes, call 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** GenerateRowIndexDelete(). This removes the index b-tree entries 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** only. The table b-tree entry will be replaced by the new entry 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** when it is inserted. 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If either GenerateRowDelete() or GenerateRowIndexDelete() is called, 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** also invoke MultiWrite() to indicate that this VDBE may require 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** statement rollback (if the statement is aborted after the delete 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** takes place). Earlier versions called sqlite3MultiWrite() regardless, 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** but being more selective here allows statements like: 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** REPLACE INTO t(rowid) VALUES($newrowid) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to run without a statement journal if there are no indexes on the 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** table. 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Trigger *pTrigger = 0; 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->db->flags&SQLITE_RecTriggers ){ 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){ 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3MultiWrite(pParse); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3GenerateRowDelete( 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse, pTab, baseCur, regRowid, 0, pTrigger, OE_Replace 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pTab->pIndex ){ 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3MultiWrite(pParse); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3GenerateRowIndexDelete(pParse, pTab, baseCur, 0); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seenReplace = 1; 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Ignore: { 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( seenReplace==0 ); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j3); 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isUpdate ){ 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j2); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Test all UNIQUE constraints by creating entries for each UNIQUE 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** index and making sure that duplicate entries do not already exist. 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Add the new records to the indices as we go. 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(iCur=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, iCur++){ 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regIdx; 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regR; 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( aRegIdx[iCur]==0 ) continue; /* Skip unused indices */ 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Create a key for accessing the index entry */ 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regIdx = sqlite3GetTempRange(pParse, pIdx->nColumn+1); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pIdx->nColumn; i++){ 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idx = pIdx->aiColumn[i]; 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( idx==pTab->iPKey ){ 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_SCopy, regRowid, regIdx+i); 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_SCopy, regData+idx, regIdx+i); 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_SCopy, regRowid, regIdx+i); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn+1, aRegIdx[iCur]); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), P4_TRANSIENT); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheAffinityChange(pParse, regIdx, pIdx->nColumn+1); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Find out what action to take in case there is an indexing conflict */ 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = pIdx->onError; 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( onError==OE_None ){ 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn+1); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; /* pIdx is not a UNIQUE index */ 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( overrideError!=OE_Default ){ 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = overrideError; 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( onError==OE_Default ){ 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = OE_Abort; 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( seenReplace ){ 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( onError==OE_Ignore ) onError = OE_Replace; 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if( onError==OE_Fail ) onError = OE_Abort; 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check to see if the new index entry will be unique */ 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regR = sqlite3GetTempReg(pParse); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_SCopy, regOldRowid, regR); 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j3 = sqlite3VdbeAddOp4(v, OP_IsUnique, baseCur+iCur+1, 0, 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regR, SQLITE_INT_TO_PTR(regIdx), 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P4_INT32); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn+1); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate code that executes if the new index entry is not unique */ 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || onError==OE_Ignore || onError==OE_Replace ); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( onError ){ 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Rollback: 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Abort: 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Fail: { 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j; 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrAccum errMsg; 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zSep; 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zErr; 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3StrAccumInit(&errMsg, 0, 0, 200); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errMsg.db = pParse->db; 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSep = pIdx->nColumn>1 ? "columns " : "column "; 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<pIdx->nColumn; j++){ 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zCol = pTab->aCol[pIdx->aiColumn[j]].zName; 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3StrAccumAppend(&errMsg, zSep, -1); 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zSep = ", "; 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3StrAccumAppend(&errMsg, zCol, -1); 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3StrAccumAppend(&errMsg, 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx->nColumn>1 ? " are not unique" : " is not unique", -1); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zErr = sqlite3StrAccumFinish(&errMsg); 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3HaltConstraint(pParse, onError, zErr, 0); 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(errMsg.db, zErr); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OE_Ignore: { 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( seenReplace==0 ); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Trigger *pTrigger = 0; 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( onError==OE_Replace ); 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3MultiWrite(pParse); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->db->flags&SQLITE_RecTriggers ){ 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3GenerateRowDelete( 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse, pTab, baseCur, regR, 0, pTrigger, OE_Replace 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seenReplace = 1; 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j3); 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regR); 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pbMayReplace ){ 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pbMayReplace = seenReplace; 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine generates code to finish the INSERT or UPDATE operation 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that was started by a prior call to sqlite3GenerateConstraintChecks. 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A consecutive range of registers starting at regRowid contains the 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** rowid and the content to be inserted. 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The arguments to this routine should be the same as the first six 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** arguments to sqlite3GenerateConstraintChecks. 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3CompleteInsertion( 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* The parser context */ 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab, /* the table into which we are inserting */ 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int baseCur, /* Index of a read/write cursor pointing at pTab */ 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regRowid, /* Range of content */ 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *aRegIdx, /* Register used by each index. 0 for unused indices */ 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isUpdate, /* True for UPDATE, False for INSERT */ 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int appendBias, /* True if this is likely to be an append */ 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int useSeekResult /* True to set the USESEEKRESULT flag on OP_[Idx]Insert */ 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nIdx; 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx; 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 pik_flags; 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regData; 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regRec; 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(pParse); 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( v!=0 ); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTab->pSelect==0 ); /* This table is not a VIEW */ 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){} 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=nIdx-1; i>=0; i--){ 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( aRegIdx[i]==0 ) continue; 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IdxInsert, baseCur+i+1, aRegIdx[i]); 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( useSeekResult ){ 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regData = regRowid + 1; 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regRec = sqlite3GetTempReg(pParse); 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MakeRecord, regData, pTab->nCol, regRec); 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3TableAffinityStr(v, pTab); 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheAffinityChange(pParse, regData, pTab->nCol); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nested ){ 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pik_flags = 0; 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pik_flags = OPFLAG_NCHANGE; 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pik_flags |= (isUpdate?OPFLAG_ISUPDATE:OPFLAG_LASTROWID); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( appendBias ){ 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pik_flags |= OPFLAG_APPEND; 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( useSeekResult ){ 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pik_flags |= OPFLAG_USESEEKRESULT; 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Insert, baseCur, regRec, regRowid); 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pParse->nested ){ 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_TRANSIENT); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, pik_flags); 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that will open cursors for a table and for all 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** indices of that table. The "baseCur" parameter is the cursor number used 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for the table. Indices are opened on subsequent cursors. 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of indices on the table. 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3OpenTableAndIndices( 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab, /* Table to be opened */ 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int baseCur, /* Cursor number assigned to the table */ 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op /* OP_OpenRead or OP_OpenWrite */ 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDb; 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx; 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IsVirtual(pTab) ) return 0; 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(pParse); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( v!=0 ); 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OpenTable(pParse, baseCur, iDb, pTab, op); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pIdx->pSchema==pTab->pSchema ); 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, op, i+baseCur, pIdx->tnum, iDb, 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)pKey, P4_KEYINFO_HANDOFF); 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "%s", pIdx->zName)); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nTab<baseCur+i ){ 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nTab = baseCur+i; 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i-1; 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following global variable is incremented whenever the 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** transfer optimization is used. This is used for testing 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** purposes only - to make sure the transfer optimization really 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is happening when it is suppose to. 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_xferopt_count; 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_TEST */ 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_XFER_OPT 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check to collation names to see if they are compatible. 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xferCompatibleCollation(const char *z1, const char *z2){ 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z1==0 ){ 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return z2==0; 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z2==0 ){ 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3StrICmp(z1, z2)==0; 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check to see if index pSrc is compatible as a source of data 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for index pDest in an insert transfer optimization. The rules 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for a compatible index: 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * The index is over the same set of columns 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * The same DESC and ASC markings occurs on all columns 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * The same onError processing (OE_Abort, OE_Ignore, etc) 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * The same collating sequence on each column 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xferCompatibleIndex(Index *pDest, Index *pSrc){ 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pDest && pSrc ); 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pDest->pTable!=pSrc->pTable ); 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->nColumn!=pSrc->nColumn ){ 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Different number of columns */ 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->onError!=pSrc->onError ){ 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Different conflict resolution strategies */ 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pSrc->nColumn; i++){ 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrc->aiColumn[i]!=pDest->aiColumn[i] ){ 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Different columns indexed */ 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrc->aSortOrder[i]!=pDest->aSortOrder[i] ){ 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Different sort orders */ 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !xferCompatibleCollation(pSrc->azColl[i],pDest->azColl[i]) ){ 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Different collating sequences */ 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If no test above fails then the indices must be compatible */ 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Attempt the transfer optimization on INSERTs of the form 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** INSERT INTO tab1 SELECT * FROM tab2; 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This optimization is only attempted if 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (1) tab1 and tab2 have identical schemas including all the 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** same indices and constraints 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (2) tab1 and tab2 are different tables 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (3) There must be no triggers on tab1 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (4) The result set of the SELECT statement is "*" 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (5) The SELECT statement has no WHERE, HAVING, ORDER BY, GROUP BY, 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or LIMIT clause. 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (6) The SELECT statement is a simple (not a compound) select that 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** contains only tab2 in its FROM clause 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This method for implementing the INSERT transfers raw records from 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tab2 over to tab1. The columns are not decoded. Raw records from 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the indices of tab2 are transfered to tab1 as well. In so doing, 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the resulting tab1 has much less fragmentation. 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine returns TRUE if the optimization is attempted. If any 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the conditions above fail so that the optimization should not 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be attempted, then this routine returns FALSE. 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xferOptimization( 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parser context */ 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pDest, /* The table we are inserting into */ 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSelect, /* A SELECT statement to use as the data source */ 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int onError, /* How to handle constraint errors */ 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDbDest /* The database of pDest */ 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList; /* The result set of the SELECT */ 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pSrc; /* The table in the FROM clause of SELECT */ 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pSrcIdx, *pDestIdx; /* Source and destination indices */ 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pItem; /* An element of pSelect->pSrc */ 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* Loop counter */ 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDbSrc; /* The database of pSrc */ 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iSrc, iDest; /* Cursors from source and destination */ 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr1, addr2; /* Loop addresses */ 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int emptyDestTest; /* Address of test for empty pDest */ 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int emptySrcTest; /* Address of test for empty pSrc */ 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; /* The VDBE we are building */ 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pKey; /* Key information for an index */ 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regAutoinc; /* Memory register used by AUTOINC */ 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */ 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regData, regRowid; /* Registers holding data and rowid */ 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect==0 ){ 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Must be of the form INSERT INTO ... SELECT ... */ 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3TriggerList(pParse, pDest) ){ 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* tab1 must not have triggers */ 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->tabFlags & TF_Virtual ){ 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* tab1 must not be a virtual table */ 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( onError==OE_Default ){ 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) onError = OE_Abort; 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( onError!=OE_Abort && onError!=OE_Rollback ){ 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Cannot do OR REPLACE or OR IGNORE or OR FAIL */ 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(pSelect->pSrc); /* allocated even if there is no FROM clause */ 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect->pSrc->nSrc!=1 ){ 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* FROM clause must have exactly one term */ 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect->pSrc->a[0].pSelect ){ 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* FROM clause cannot contain a subquery */ 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect->pWhere ){ 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* SELECT may not have a WHERE clause */ 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect->pOrderBy ){ 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* SELECT may not have an ORDER BY clause */ 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Do not need to test for a HAVING clause. If HAVING is present but 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** there is no ORDER BY, we will get an error. */ 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect->pGroupBy ){ 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* SELECT may not have a GROUP BY clause */ 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect->pLimit ){ 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* SELECT may not have a LIMIT clause */ 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSelect->pOffset==0 ); /* Must be so if pLimit==0 */ 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect->pPrior ){ 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* SELECT may not be a compound query */ 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect->selFlags & SF_Distinct ){ 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* SELECT may not be DISTINCT */ 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = pSelect->pEList; 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pEList!=0 ); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEList->nExpr!=1 ){ 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* The result set must have exactly one column */ 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pEList->a[0].pExpr ); 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEList->a[0].pExpr->op!=TK_ALL ){ 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* The result set must be the special operator "*" */ 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* At this point we have established that the statement is of the 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** correct syntactic form to participate in this optimization. Now 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** we have to check the semantics. 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem = pSelect->pSrc->a; 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSrc = sqlite3LocateTable(pParse, 0, pItem->zName, pItem->zDatabase); 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrc==0 ){ 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* FROM clause does not contain a real table */ 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrc==pDest ){ 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* tab1 and tab2 may not be the same table */ 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrc->tabFlags & TF_Virtual ){ 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* tab2 must not be a virtual table */ 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrc->pSelect ){ 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* tab2 may not be a view */ 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->nCol!=pSrc->nCol ){ 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Number of columns must be the same in tab1 and tab2 */ 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->iPKey!=pSrc->iPKey ){ 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Both tables must have the same INTEGER PRIMARY KEY */ 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pDest->nCol; i++){ 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->aCol[i].affinity!=pSrc->aCol[i].affinity ){ 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Affinity must be the same on all columns */ 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !xferCompatibleCollation(pDest->aCol[i].zColl, pSrc->aCol[i].zColl) ){ 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Collating sequence must be the same on all columns */ 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->aCol[i].notNull && !pSrc->aCol[i].notNull ){ 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* tab2 must be NOT NULL if tab1 is */ 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDestIdx->onError!=OE_None ){ 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destHasUniqueIdx = 1; 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pSrcIdx=pSrc->pIndex; pSrcIdx; pSrcIdx=pSrcIdx->pNext){ 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrcIdx==0 ){ 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* pDestIdx has no corresponding index in pSrc */ 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CHECK 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->pCheck && sqlite3ExprCompare(pSrc->pCheck, pDest->pCheck) ){ 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Tables have different CHECK constraints. Ticket #2252 */ 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we get this far, it means either: 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** * We can always do the transfer if the table contains an 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** an integer primary key 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** * We can conditionally do the transfer if the destination 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** table is empty. 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_xferopt_count++; 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iDbSrc = sqlite3SchemaToIndex(pParse->db, pSrc->pSchema); 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(pParse); 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3CodeVerifySchema(pParse, iDbSrc); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iSrc = pParse->nTab++; 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iDest = pParse->nTab++; 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regAutoinc = autoIncBegin(pParse, iDbDest, pDest); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OpenTable(pParse, iDest, iDbDest, pDest, OP_OpenWrite); 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pDest->iPKey<0 && pDest->pIndex!=0) || destHasUniqueIdx ){ 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If tables do not have an INTEGER PRIMARY KEY and there 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** are indices to be copied and the destination is not empty, 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** we have to disallow the transfer optimization because the 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the rowids might change which will mess up indexing. 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Or if the destination has a UNIQUE index and is not empty, 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** we also disallow the transfer optimization because we cannot 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** insure that all entries in the union of DEST and SRC will be 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** unique. 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emptyDestTest = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0); 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr1); 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emptyDestTest = 0; 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regData = sqlite3GetTempReg(pParse); 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regRowid = sqlite3GetTempReg(pParse); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->iPKey>=0 ){ 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3HaltConstraint( 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse, onError, "PRIMARY KEY must be unique", P4_STATIC); 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr2); 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autoIncStep(pParse, regAutoinc, regRowid); 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pDest->pIndex==0 ){ 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (pDest->tabFlags & TF_Autoincrement)==0 ); 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_RowData, iSrc, regData); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Insert, iDest, regData, regRowid); 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND); 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, -1, pDest->zName, 0); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1); 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pSrcIdx=pSrc->pIndex; ALWAYS(pSrcIdx); pSrcIdx=pSrcIdx->pNext){ 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSrcIdx ); 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKey = sqlite3IndexKeyinfo(pParse, pSrcIdx); 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_OpenRead, iSrc, pSrcIdx->tnum, iDbSrc, 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)pKey, P4_KEYINFO_HANDOFF); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "%s", pSrcIdx->zName)); 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKey = sqlite3IndexKeyinfo(pParse, pDestIdx); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_OpenWrite, iDest, pDestIdx->tnum, iDbDest, 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)pKey, P4_KEYINFO_HANDOFF); 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "%s", pDestIdx->zName)); 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_RowKey, iSrc, regData); 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_IdxInsert, iDest, regData, 1); 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1+1); 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr1); 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, emptySrcTest); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regRowid); 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regData); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( emptyDestTest ){ 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_OK, 0); 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, emptyDestTest); 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_XFER_OPT */ 1831