1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

If a virtual table xSync() returns an error message, copy it into a buffer allocated by sqlite3DbMalloc() before transfering it to Vdbe.zErrMsg.

FossilOrigin-Name: 854ba3049005adf033e07e6740a36e63f2a56758
This commit is contained in:
dan
2013-08-21 17:35:48 +00:00
parent 13c77bf86b
commit 016f7811f2
6 changed files with 40 additions and 40 deletions

View File

@@ -1,5 +1,5 @@
C Performance\senhancement\sin\sbtreeParseCellPtr(). C If\sa\svirtual\stable\sxSync()\sreturns\san\serror\smessage,\scopy\sit\sinto\sa\sbuffer\sallocated\sby\ssqlite3DbMalloc()\sbefore\stransfering\sit\sto\sVdbe.zErrMsg.
D 2013-08-21T15:52:22.167 D 2013-08-21T17:35:48.189
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -221,7 +221,7 @@ F src/shell.c 1c317a4c96d61d8d9fdad9fd1811d9b10b8c7f57
F src/sqlite.h.in bd1451ba1ab681022a53bccc3c39580ba094a3ff F src/sqlite.h.in bd1451ba1ab681022a53bccc3c39580ba094a3ff
F src/sqlite3.rc fea433eb0a59f4c9393c8e6d76a6e2596b1fe0c0 F src/sqlite3.rc fea433eb0a59f4c9393c8e6d76a6e2596b1fe0c0
F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
F src/sqliteInt.h eae58298bc7c9a491ad2fc6c600f534b74be8a11 F src/sqliteInt.h e4ae9edb97983a8d7d751559391962cf7668948c
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -277,16 +277,16 @@ F src/update.c 7f3fe64d8f3b44c44a1eac293f0f85f87c355b7a
F src/utf.c 8d819e2e5104a430fc2005f018db14347c95a38f F src/utf.c 8d819e2e5104a430fc2005f018db14347c95a38f
F src/util.c f566b5138099a2df8533b190d0dcc74b7dfbe0c9 F src/util.c f566b5138099a2df8533b190d0dcc74b7dfbe0c9
F src/vacuum.c d9c5759f4c5a438bb43c2086f72c5d2edabc36c8 F src/vacuum.c d9c5759f4c5a438bb43c2086f72c5d2edabc36c8
F src/vdbe.c 938feb53407dee2234849aad0f103ae9b941595e F src/vdbe.c d37aee2c89e2a589f2b1599e0178eb17a08a3ccb
F src/vdbe.h 4f554b5627f26710c4c36d919110a3fc611ca5c4 F src/vdbe.h 4f554b5627f26710c4c36d919110a3fc611ca5c4
F src/vdbeInt.h cbe71b8b36d8b3bba5709cc3f436c7e3b47b7b08 F src/vdbeInt.h cbe71b8b36d8b3bba5709cc3f436c7e3b47b7b08
F src/vdbeapi.c 96b24b946cf21894f63d9393e821baa2f0a80979 F src/vdbeapi.c 96b24b946cf21894f63d9393e821baa2f0a80979
F src/vdbeaux.c a6ea36a9dc714e1128a0173249a0532ddcab0489 F src/vdbeaux.c c7fe2695e256dbf254113c4fe90d3ec9aabe3bbe
F src/vdbeblob.c 5dc79627775bd9a9b494dd956e26297946417d69 F src/vdbeblob.c 5dc79627775bd9a9b494dd956e26297946417d69
F src/vdbemem.c 833005f1cbbf447289f1973dba2a0c2228c7b8ab F src/vdbemem.c 833005f1cbbf447289f1973dba2a0c2228c7b8ab
F src/vdbesort.c 3937e06b2a0e354500e17dc206ef4c35770a5017 F src/vdbesort.c 3937e06b2a0e354500e17dc206ef4c35770a5017
F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc
F src/vtab.c 2e8b489db47e20ae36cd247932dc671c9ded0624 F src/vtab.c 165ce0e797c2cd23badb104c9f2ae9042d6d942c
F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73 F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73
@@ -1105,7 +1105,7 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae
F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
P 5f35c8cb8f8b67121c70f98c02c4aa7c25327690 P a17190a2296e8cd5e59524ff5914fc5ea3560697
R e14622f8e8b62bb772b89104f8221b5c R 960d322e69aedcdd76cb08d63bcf1bec
U drh U dan
Z b5924f726ed7a29e078b915e4c18ae4c Z adc03a3c46cd4ac4ea0aa84c35a35580

View File

@@ -1 +1 @@
a17190a2296e8cd5e59524ff5914fc5ea3560697 854ba3049005adf033e07e6740a36e63f2a56758

View File

@@ -3153,13 +3153,14 @@ void sqlite3AutoLoadExtensions(sqlite3*);
#else #else
void sqlite3VtabClear(sqlite3 *db, Table*); void sqlite3VtabClear(sqlite3 *db, Table*);
void sqlite3VtabDisconnect(sqlite3 *db, Table *p); void sqlite3VtabDisconnect(sqlite3 *db, Table *p);
int sqlite3VtabSync(sqlite3 *db, char **); int sqlite3VtabSync(sqlite3 *db, Vdbe*);
int sqlite3VtabRollback(sqlite3 *db); int sqlite3VtabRollback(sqlite3 *db);
int sqlite3VtabCommit(sqlite3 *db); int sqlite3VtabCommit(sqlite3 *db);
void sqlite3VtabLock(VTable *); void sqlite3VtabLock(VTable *);
void sqlite3VtabUnlock(VTable *); void sqlite3VtabUnlock(VTable *);
void sqlite3VtabUnlockList(sqlite3*); void sqlite3VtabUnlockList(sqlite3*);
int sqlite3VtabSavepoint(sqlite3 *, int, int); int sqlite3VtabSavepoint(sqlite3 *, int, int);
void sqlite3VtabImportErrmsg(Vdbe*, sqlite3_vtab*);
VTable *sqlite3GetVTable(sqlite3*, Table*); VTable *sqlite3GetVTable(sqlite3*, Table*);
# define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0) # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
#endif #endif

View File

@@ -497,19 +497,6 @@ static int checkSavepointCount(sqlite3 *db){
} }
#endif #endif
/*
** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored
** in memory obtained from sqlite3_malloc) into a Vdbe.zErrMsg (text stored
** in memory obtained from sqlite3DbMalloc).
*/
static void importVtabErrMsg(Vdbe *p, sqlite3_vtab *pVtab){
sqlite3 *db = p->db;
sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg);
sqlite3_free(pVtab->zErrMsg);
pVtab->zErrMsg = 0;
}
/* /*
** Execute as much of a VDBE program as we can then return. ** Execute as much of a VDBE program as we can then return.
@@ -4350,7 +4337,7 @@ case OP_Rowid: { /* out2-prerelease */
pModule = pVtab->pModule; pModule = pVtab->pModule;
assert( pModule->xRowid ); assert( pModule->xRowid );
rc = pModule->xRowid(pC->pVtabCursor, &v); rc = pModule->xRowid(pC->pVtabCursor, &v);
importVtabErrMsg(p, pVtab); sqlite3VtabImportErrmsg(p, pVtab);
#endif /* SQLITE_OMIT_VIRTUALTABLE */ #endif /* SQLITE_OMIT_VIRTUALTABLE */
}else{ }else{
assert( pC->pCursor!=0 ); assert( pC->pCursor!=0 );
@@ -5743,7 +5730,7 @@ case OP_VBegin: {
VTable *pVTab; VTable *pVTab;
pVTab = pOp->p4.pVtab; pVTab = pOp->p4.pVtab;
rc = sqlite3VtabBegin(db, pVTab); rc = sqlite3VtabBegin(db, pVTab);
if( pVTab ) importVtabErrMsg(p, pVTab->pVtab); if( pVTab ) sqlite3VtabImportErrmsg(p, pVTab->pVtab);
break; break;
} }
#endif /* SQLITE_OMIT_VIRTUALTABLE */ #endif /* SQLITE_OMIT_VIRTUALTABLE */
@@ -5794,7 +5781,7 @@ case OP_VOpen: {
pModule = (sqlite3_module *)pVtab->pModule; pModule = (sqlite3_module *)pVtab->pModule;
assert(pVtab && pModule); assert(pVtab && pModule);
rc = pModule->xOpen(pVtab, &pVtabCursor); rc = pModule->xOpen(pVtab, &pVtabCursor);
importVtabErrMsg(p, pVtab); sqlite3VtabImportErrmsg(p, pVtab);
if( SQLITE_OK==rc ){ if( SQLITE_OK==rc ){
/* Initialize sqlite3_vtab_cursor base class */ /* Initialize sqlite3_vtab_cursor base class */
pVtabCursor->pVtab = pVtab; pVtabCursor->pVtab = pVtab;
@@ -5872,7 +5859,7 @@ case OP_VFilter: { /* jump */
p->inVtabMethod = 1; p->inVtabMethod = 1;
rc = pModule->xFilter(pVtabCursor, iQuery, pOp->p4.z, nArg, apArg); rc = pModule->xFilter(pVtabCursor, iQuery, pOp->p4.z, nArg, apArg);
p->inVtabMethod = 0; p->inVtabMethod = 0;
importVtabErrMsg(p, pVtab); sqlite3VtabImportErrmsg(p, pVtab);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
res = pModule->xEof(pVtabCursor); res = pModule->xEof(pVtabCursor);
} }
@@ -5923,7 +5910,7 @@ case OP_VColumn: {
MemSetTypeFlag(&sContext.s, MEM_Null); MemSetTypeFlag(&sContext.s, MEM_Null);
rc = pModule->xColumn(pCur->pVtabCursor, &sContext, pOp->p2); rc = pModule->xColumn(pCur->pVtabCursor, &sContext, pOp->p2);
importVtabErrMsg(p, pVtab); sqlite3VtabImportErrmsg(p, pVtab);
if( sContext.isError ){ if( sContext.isError ){
rc = sContext.isError; rc = sContext.isError;
} }
@@ -5976,7 +5963,7 @@ case OP_VNext: { /* jump */
p->inVtabMethod = 1; p->inVtabMethod = 1;
rc = pModule->xNext(pCur->pVtabCursor); rc = pModule->xNext(pCur->pVtabCursor);
p->inVtabMethod = 0; p->inVtabMethod = 0;
importVtabErrMsg(p, pVtab); sqlite3VtabImportErrmsg(p, pVtab);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
res = pModule->xEof(pCur->pVtabCursor); res = pModule->xEof(pCur->pVtabCursor);
} }
@@ -6013,7 +6000,7 @@ case OP_VRename: {
rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8); rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = pVtab->pModule->xRename(pVtab, pName->z); rc = pVtab->pModule->xRename(pVtab, pName->z);
importVtabErrMsg(p, pVtab); sqlite3VtabImportErrmsg(p, pVtab);
p->expired = 0; p->expired = 0;
} }
break; break;
@@ -6075,7 +6062,7 @@ case OP_VUpdate: {
db->vtabOnConflict = pOp->p5; db->vtabOnConflict = pOp->p5;
rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid); rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid);
db->vtabOnConflict = vtabOnConflict; db->vtabOnConflict = vtabOnConflict;
importVtabErrMsg(p, pVtab); sqlite3VtabImportErrmsg(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 = lastRowid = rowid; db->lastRowid = lastRowid = rowid;

View File

@@ -1765,7 +1765,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){
** required, as an xSync() callback may add an attached database ** required, as an xSync() callback may add an attached database
** to the transaction. ** to the transaction.
*/ */
rc = sqlite3VtabSync(db, &p->zErrMsg); rc = sqlite3VtabSync(db, p);
/* This loop determines (a) if the commit hook should be invoked and /* This loop determines (a) if the commit hook should be invoked and
** (b) how many database files have open write transactions, not ** (b) how many database files have open write transactions, not
@@ -3304,3 +3304,18 @@ void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){
v->expmask |= ((u32)1 << (iVar-1)); v->expmask |= ((u32)1 << (iVar-1));
} }
} }
#ifndef SQLITE_OMIT_VIRTUALTABLE
/*
** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored
** in memory obtained from sqlite3_malloc) into a Vdbe.zErrMsg (text stored
** in memory obtained from sqlite3DbMalloc).
*/
void sqlite3VtabImportErrmsg(Vdbe *p, sqlite3_vtab *pVtab){
sqlite3 *db = p->db;
sqlite3DbFree(db, p->zErrMsg);
p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg);
sqlite3_free(pVtab->zErrMsg);
pVtab->zErrMsg = 0;
}
#endif /* SQLITE_OMIT_VIRTUALTABLE */

View File

@@ -810,10 +810,9 @@ static void callFinaliser(sqlite3 *db, int offset){
** array. Return the error code for the first error that occurs, or ** array. Return the error code for the first error that occurs, or
** SQLITE_OK if all xSync operations are successful. ** SQLITE_OK if all xSync operations are successful.
** **
** Set *pzErrmsg to point to a buffer that should be released using ** If an error message is available, leave it in p->zErrMsg.
** sqlite3DbFree() containing an error message, if one is available.
*/ */
int sqlite3VtabSync(sqlite3 *db, char **pzErrmsg){ int sqlite3VtabSync(sqlite3 *db, Vdbe *p){
int i; int i;
int rc = SQLITE_OK; int rc = SQLITE_OK;
VTable **aVTrans = db->aVTrans; VTable **aVTrans = db->aVTrans;
@@ -824,9 +823,7 @@ int sqlite3VtabSync(sqlite3 *db, char **pzErrmsg){
sqlite3_vtab *pVtab = aVTrans[i]->pVtab; sqlite3_vtab *pVtab = aVTrans[i]->pVtab;
if( pVtab && (x = pVtab->pModule->xSync)!=0 ){ if( pVtab && (x = pVtab->pModule->xSync)!=0 ){
rc = x(pVtab); rc = x(pVtab);
sqlite3DbFree(db, *pzErrmsg); sqlite3VtabImportErrmsg(p, pVtab);
*pzErrmsg = pVtab->zErrMsg;
pVtab->zErrMsg = 0;
} }
} }
db->aVTrans = aVTrans; db->aVTrans = aVTrans;