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