mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Make arrangements so that virtual table inserts into shadow tables do
not modify the sqlite3_last_insert_rowid() return. Document that this is how sqlite3_last_insert_rowid() works. FossilOrigin-Name: e569f18b989aef853c9d71eaf73d6967f0a8c583
This commit is contained in:
14
manifest
14
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Also\sadd\sfts3_term.c\sto\smain.mk.
|
C Make\sarrangements\sso\sthat\svirtual\stable\sinserts\sinto\sshadow\stables\sdo\nnot\smodify\sthe\ssqlite3_last_insert_rowid()\sreturn.\s\sDocument\sthat\sthis\nis\show\ssqlite3_last_insert_rowid()\sworks.
|
||||||
D 2011-05-13T17:11:20.942
|
D 2011-05-13T18:51:42.945
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in 4a7ed220f2e9a068fd0f0b2ec451439f63e629fc
|
F Makefile.in 4a7ed220f2e9a068fd0f0b2ec451439f63e629fc
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@@ -179,7 +179,7 @@ F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706
|
|||||||
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
|
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
|
||||||
F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff
|
F src/select.c d9d440809025a58547e39f4f268c2a296bfb56ff
|
||||||
F src/shell.c 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79
|
F src/shell.c 72e7e176bf46d5c6518d15ac4ad6847c4bb5df79
|
||||||
F src/sqlite.h.in 26f123aa6f23b6cbd84d4ef6df3b8210a23a3b0b
|
F src/sqlite.h.in d7cc9050446a5ed9eb896362dd264e6e10e0cc03
|
||||||
F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754
|
F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754
|
||||||
F src/sqliteInt.h b34bd64a7ade4808fcc301e0bb67ef5051ea49c6
|
F src/sqliteInt.h b34bd64a7ade4808fcc301e0bb67ef5051ea49c6
|
||||||
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
|
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
|
||||||
@@ -236,7 +236,7 @@ F src/update.c 5bcb56e5c7380a2eecb0e71891dbd4ad7437748f
|
|||||||
F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60
|
F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60
|
||||||
F src/util.c 914e860d21496b19a912cd14f6f7a889a22f44e1
|
F src/util.c 914e860d21496b19a912cd14f6f7a889a22f44e1
|
||||||
F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e
|
F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e
|
||||||
F src/vdbe.c b2070c926a896e59234e27412a45e261fe752235
|
F src/vdbe.c 343a068e8daeb8475e66776feb9f2974046e95c5
|
||||||
F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797
|
F src/vdbe.h 8a675fefdf7119441fe817c800a9a52440c2e797
|
||||||
F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae
|
F src/vdbeInt.h fe8f58d305e629fff02f61f655aca1d299f1f6ae
|
||||||
F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1
|
F src/vdbeapi.c e0e2672e0a96ae3f8575c8ecd02912a3e8a554a1
|
||||||
@@ -935,7 +935,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
|
|||||||
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
|
||||||
F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c
|
F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c
|
||||||
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
|
||||||
P 6ee0773290a4c4aac2b2b5e1741e65170e08a8bb
|
P 966f2d2c1f01b6345eab5df87a40d337ced1c087
|
||||||
R e29a65a14e0a90ae39fc424e77122ad0
|
R bc50f0e830166d8298c23030a9099063
|
||||||
U drh
|
U drh
|
||||||
Z 4626b21df75720896779227cd4b29fbb
|
Z 667528c5e659a82acf6d9a2a3fcf251b
|
||||||
|
@@ -1 +1 @@
|
|||||||
966f2d2c1f01b6345eab5df87a40d337ced1c087
|
e569f18b989aef853c9d71eaf73d6967f0a8c583
|
@@ -1548,13 +1548,17 @@ int sqlite3_extended_result_codes(sqlite3*, int onoff);
|
|||||||
**
|
**
|
||||||
** ^This routine returns the [rowid] of the most recent
|
** ^This routine returns the [rowid] of the most recent
|
||||||
** successful [INSERT] into the database from the [database connection]
|
** successful [INSERT] into the database from the [database connection]
|
||||||
** in the first argument. ^If no successful [INSERT]s
|
** in the first argument. ^As of SQLite version 3.7.7, this routines
|
||||||
|
** records the last insert rowid of both ordinary tables and [virtual tables].
|
||||||
|
** ^If no successful [INSERT]s
|
||||||
** have ever occurred on that database connection, zero is returned.
|
** have ever occurred on that database connection, zero is returned.
|
||||||
**
|
**
|
||||||
** ^(If an [INSERT] occurs within a trigger, then the [rowid] of the inserted
|
** ^(If an [INSERT] occurs within a trigger or within a [virtual table]
|
||||||
** row is returned by this routine as long as the trigger is running.
|
** method, then this routine will return the [rowid] of the inserted
|
||||||
** But once the trigger terminates, the value returned by this routine
|
** row as long as the trigger or virtual table method is running.
|
||||||
** reverts to the last value inserted before the trigger fired.)^
|
** But once the trigger or virtual table method ends, the value returned
|
||||||
|
** by this routine reverts to what it was before the trigger or virtual
|
||||||
|
** table method began.)^
|
||||||
**
|
**
|
||||||
** ^An [INSERT] that fails due to a constraint violation is not a
|
** ^An [INSERT] that fails due to a constraint violation is not a
|
||||||
** successful [INSERT] and does not change the value returned by this
|
** successful [INSERT] and does not change the value returned by this
|
||||||
|
13
src/vdbe.c
13
src/vdbe.c
@@ -564,6 +564,7 @@ int sqlite3VdbeExec(
|
|||||||
Mem *pOut = 0; /* Output operand */
|
Mem *pOut = 0; /* Output operand */
|
||||||
int iCompare = 0; /* Result of last OP_Compare operation */
|
int iCompare = 0; /* Result of last OP_Compare operation */
|
||||||
int *aPermute = 0; /* Permutation of columns for OP_Compare */
|
int *aPermute = 0; /* Permutation of columns for OP_Compare */
|
||||||
|
i64 lastRowid = db->lastRowid; /* Saved value of the last insert ROWID */
|
||||||
#ifdef VDBE_PROFILE
|
#ifdef VDBE_PROFILE
|
||||||
u64 start; /* CPU clock count at start of opcode */
|
u64 start; /* CPU clock count at start of opcode */
|
||||||
int origPc; /* Program counter at start of opcode */
|
int origPc; /* Program counter at start of opcode */
|
||||||
@@ -833,6 +834,7 @@ case OP_Halt: {
|
|||||||
p->nFrame--;
|
p->nFrame--;
|
||||||
sqlite3VdbeSetChanges(db, p->nChange);
|
sqlite3VdbeSetChanges(db, p->nChange);
|
||||||
pc = sqlite3VdbeFrameRestore(pFrame);
|
pc = sqlite3VdbeFrameRestore(pFrame);
|
||||||
|
lastRowid = db->lastRowid;
|
||||||
if( pOp->p2==OE_Ignore ){
|
if( pOp->p2==OE_Ignore ){
|
||||||
/* Instruction pc is the OP_Program that invoked the sub-program
|
/* Instruction pc is the OP_Program that invoked the sub-program
|
||||||
** currently being halted. If the p2 instruction of this OP_Halt
|
** currently being halted. If the p2 instruction of this OP_Halt
|
||||||
@@ -1393,7 +1395,9 @@ case OP_Function: {
|
|||||||
assert( pOp[-1].opcode==OP_CollSeq );
|
assert( pOp[-1].opcode==OP_CollSeq );
|
||||||
ctx.pColl = pOp[-1].p4.pColl;
|
ctx.pColl = pOp[-1].p4.pColl;
|
||||||
}
|
}
|
||||||
|
db->lastRowid = lastRowid;
|
||||||
(*ctx.pFunc->xFunc)(&ctx, n, apVal); /* IMP: R-24505-23230 */
|
(*ctx.pFunc->xFunc)(&ctx, n, apVal); /* IMP: R-24505-23230 */
|
||||||
|
lastRowid = db->lastRowid;
|
||||||
if( db->mallocFailed ){
|
if( db->mallocFailed ){
|
||||||
/* Even though a malloc() has failed, the implementation of the
|
/* Even though a malloc() has failed, the implementation of the
|
||||||
** user function may have called an sqlite3_result_XXX() function
|
** user function may have called an sqlite3_result_XXX() function
|
||||||
@@ -3809,7 +3813,7 @@ case OP_NewRowid: { /* out2-prerelease */
|
|||||||
assert( pOp->p3==0 ); /* We cannot be in random rowid mode if this is
|
assert( pOp->p3==0 ); /* We cannot be in random rowid mode if this is
|
||||||
** an AUTOINCREMENT table. */
|
** an AUTOINCREMENT table. */
|
||||||
/* on the first attempt, simply do one more than previous */
|
/* on the first attempt, simply do one more than previous */
|
||||||
v = db->lastRowid;
|
v = lastRowid;
|
||||||
v &= (MAX_ROWID>>1); /* ensure doesn't go negative */
|
v &= (MAX_ROWID>>1); /* ensure doesn't go negative */
|
||||||
v++; /* ensure non-zero */
|
v++; /* ensure non-zero */
|
||||||
cnt = 0;
|
cnt = 0;
|
||||||
@@ -3919,7 +3923,7 @@ case OP_InsertInt: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++;
|
if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++;
|
||||||
if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = iKey;
|
if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = lastRowid = iKey;
|
||||||
if( pData->flags & MEM_Null ){
|
if( pData->flags & MEM_Null ){
|
||||||
pData->z = 0;
|
pData->z = 0;
|
||||||
pData->n = 0;
|
pData->n = 0;
|
||||||
@@ -5007,7 +5011,7 @@ case OP_Program: { /* jump */
|
|||||||
|
|
||||||
p->nFrame++;
|
p->nFrame++;
|
||||||
pFrame->pParent = p->pFrame;
|
pFrame->pParent = p->pFrame;
|
||||||
pFrame->lastRowid = db->lastRowid;
|
pFrame->lastRowid = lastRowid;
|
||||||
pFrame->nChange = p->nChange;
|
pFrame->nChange = p->nChange;
|
||||||
p->nChange = 0;
|
p->nChange = 0;
|
||||||
p->pFrame = pFrame;
|
p->pFrame = pFrame;
|
||||||
@@ -5814,7 +5818,7 @@ case OP_VUpdate: {
|
|||||||
importVtabErrMsg(p, pVtab);
|
importVtabErrMsg(p, pVtab);
|
||||||
if( rc==SQLITE_OK && pOp->p1 ){
|
if( rc==SQLITE_OK && pOp->p1 ){
|
||||||
assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) );
|
assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) );
|
||||||
db->lastRowid = rowid;
|
db->lastRowid = lastRowid = rowid;
|
||||||
}
|
}
|
||||||
if( rc==SQLITE_CONSTRAINT && pOp->p4.pVtab->bConstraint ){
|
if( rc==SQLITE_CONSTRAINT && pOp->p4.pVtab->bConstraint ){
|
||||||
if( pOp->p5==OE_Ignore ){
|
if( pOp->p5==OE_Ignore ){
|
||||||
@@ -5972,6 +5976,7 @@ vdbe_error_halt:
|
|||||||
** release the mutexes on btrees that were acquired at the
|
** release the mutexes on btrees that were acquired at the
|
||||||
** top. */
|
** top. */
|
||||||
vdbe_return:
|
vdbe_return:
|
||||||
|
db->lastRowid = lastRowid;
|
||||||
sqlite3VdbeLeave(p);
|
sqlite3VdbeLeave(p);
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user