From: dan Date: Wed, 19 Dec 2018 17:05:48 +0000 (+0000) Subject: Add new interfaces sqlite3_result_pointer(), and X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aff8dc2f94846b81fa28ce3b2650586269fb54e1;p=thirdparty%2Fsqlite.git Add new interfaces sqlite3_result_pointer(), and sqlite3_value_pointer() and use them to transfer the eponymous FTS3 column pointer to the snippet() and offsets() routines. Cherrypick from commit [8201f4e1] on branch-3.18. FossilOrigin-Name: 553a923c82e968104296253d07dc6e1219747d85ebb7b02640d33d7056418df4 --- diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 72deb18c1b..f9b911f91e 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -3343,8 +3343,7 @@ static int fts3ColumnMethod( switch( iCol-p->nColumn ){ case 0: /* The special 'table-name' column */ - sqlite3_result_blob(pCtx, &pCsr, sizeof(Fts3Cursor*), SQLITE_TRANSIENT); - sqlite3_result_subtype(pCtx, SQLITE_BLOB); + sqlite3_result_pointer(pCtx, pCsr); break; case 1: @@ -3562,18 +3561,15 @@ static int fts3FunctionArg( sqlite3_value *pVal, /* argv[0] passed to function */ Fts3Cursor **ppCsr /* OUT: Store cursor handle here */ ){ - int rc = SQLITE_OK; - if( sqlite3_value_subtype(pVal)==SQLITE_BLOB - && sqlite3_value_bytes(pVal)==sizeof(Fts3Cursor*) - ){ - *ppCsr = *(Fts3Cursor**)sqlite3_value_blob(pVal); - }else{ + Fts3Cursor *pRet = (Fts3Cursor*)sqlite3_value_pointer(pVal); + if( pRet==0 ){ char *zErr = sqlite3_mprintf("illegal first argument to %s", zFunc); sqlite3_result_error(pContext, zErr, -1); sqlite3_free(zErr); - rc = SQLITE_ERROR; + return SQLITE_ERROR; } - return rc; + *ppCsr = pRet; + return SQLITE_OK; } /* diff --git a/manifest b/manifest index de48e28835..846082bdd5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scrash\sthat\scan\sfollow\san\sOOM\sin\sfts3\son\sthis\sbranch. -D 2018-12-19T14:44:20.804 +C Add\snew\sinterfaces\ssqlite3_result_pointer(),\sand\nsqlite3_value_pointer()\sand\suse\sthem\sto\stransfer\sthe\seponymous\sFTS3\scolumn\npointer\sto\sthe\ssnippet()\sand\soffsets()\sroutines.\s\sCherrypick\sfrom\scommit\n[8201f4e1]\son\sbranch-3.18. +D 2018-12-19T17:05:48.510 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8eeb80162074004e906b53d7340a12a14c471a83743aab975947e95ce061efcc @@ -70,7 +70,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c d890fb31adb655d74321b667f011b991d279991c4ac220e8f7af81806f262a3e +F ext/fts3/fts3.c cac1ce084b05994f745eb1f8748a7aa9cd5e8dbb9fff885a8debc108f7361a44 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h eb2502000148e80913b965db3e59f29251266d0a F ext/fts3/fts3_aux.c 9edc3655fcb287f0467d0a4b886a01c6185fe9f1 @@ -405,7 +405,7 @@ F src/resolve.c 3e518b962d932a997fae373366880fc028c75706 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac F src/select.c 32194c97925b1115d86ceb0ee120161cab84ab865ef8a05e7c3e29126862642b F src/shell.c a37d96b20b3644d0eb905df5aa7a0fcf9f6e73c15898337230c760a24a8df794 -F src/sqlite.h.in aa1bccab835fbea701599ffc747d2fed9098142b9b52e714229d7789a140ad25 +F src/sqlite.h.in 7ad8a14995ad817af0b80cc068ecc37dbf5e79f4d99fa83404585291c3305e79 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 58fd0676d3111d02e62e5a35992a7d3da5d3f88753acc174f2d37b774fbbdd28 F src/sqliteInt.h 40785f84fc3d3b25b54f4325d42992f41a73e81de57b354271bd2de0ae377625 @@ -472,8 +472,8 @@ F src/util.c fc081ec6f63448dcd80d3dfad35baecfa104823254a815b081a4d9fe76e1db23 F src/vacuum.c 1fe4555cd8c9b263afb85b5b4ee3a4a4181ad569 F src/vdbe.c 70f1c27d3de7b3ea68d3ee2b7fbf407335b66f7483eb321201ffe53724f9c54e F src/vdbe.h f7d1456e28875c2dcb964056589b5b7149ab7edf39edeca801596a39bb3d3848 -F src/vdbeInt.h 1ecdacc1322fdd3241ec30c32a480e328a6f864e532dc53fae8e0ab68121aebf -F src/vdbeapi.c dc904b3c5e459727993c2421e653e29d63223846d129fae98adc782b0a996481 +F src/vdbeInt.h e5080801a95e773a08a6c96226729d13fe4ade0ca74ffb0df3507b5c37bae70c +F src/vdbeapi.c e5ec7a4e13959a204711f7c7d9e621b34368065b77184f41281ebc80c3da3bbe F src/vdbeaux.c 01dcf59b2a96bd3cc9db8c0d7f266518d113587459a2b3316279c4f9c90f28a9 F src/vdbeblob.c 359891617358deefc85bef7bcf787fa6b77facb9 F src/vdbemem.c 2c70f8f5de6c71fb99a22c5b83be9fab5c47cdd8e279fa44a8c00cfed06d7e89 @@ -808,7 +808,7 @@ F test/fts3prefix2.test e1f0a822ca661dced7f12ce392e14eaf65609dce F test/fts3query.test f33eb71a1fe1084ea585eeb7ee76b390729f5170 F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e -F test/fts3snippet.test 01a4231816e03a0660ae53ba2404fe69012fe0db +F test/fts3snippet.test e54e389b6d6ee4642217bb6876950ef9360385b21d2c48db218f24a46713687a F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca F test/fts3tok1.test 178c050199af8c05299b1ad572514ce1c54b7827 F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d @@ -1583,7 +1583,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4f315e4a3d15b9196924db10dee9c1444964fc4590a153950bab9b1ec3ca4f0e -R bca17bcac50eb96e0f867715ce42e472 +P de0781485701c138be58dcb0bb8eaa9dd2bad828ccafcc40db906f606d967639 +Q +8201f4e1c566f7223c71c07e6b703d1352801f1b2daa0fd00895a18e1944cb4d +R bf76a158ff1b8786cd0436ceb30a9674 U dan -Z fff77d206041cc32927165662ab63459 +Z dc92f0b4dd07f291e7813b0fabf6e892 diff --git a/manifest.uuid b/manifest.uuid index c4e3429840..2ab94187ff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -de0781485701c138be58dcb0bb8eaa9dd2bad828ccafcc40db906f606d967639 \ No newline at end of file +553a923c82e968104296253d07dc6e1219747d85ebb7b02640d33d7056418df4 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 4d54dcd7d7..1458eff0bd 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -4683,6 +4683,7 @@ int sqlite3_value_bytes16(sqlite3_value*); double sqlite3_value_double(sqlite3_value*); int sqlite3_value_int(sqlite3_value*); sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +void *sqlite3_value_pointer(sqlite3_value*); const unsigned char *sqlite3_value_text(sqlite3_value*); const void *sqlite3_value_text16(sqlite3_value*); const void *sqlite3_value_text16le(sqlite3_value*); @@ -5001,6 +5002,7 @@ void sqlite3_result_error_code(sqlite3_context*, int); void sqlite3_result_int(sqlite3_context*, int); void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); void sqlite3_result_null(sqlite3_context*); +void sqlite3_result_pointer(sqlite3_context*, void*); void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); void sqlite3_result_text64(sqlite3_context*, const char*,sqlite3_uint64, void(*)(void*), unsigned char encoding); diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 65e47c33f3..e412dcfd0b 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -190,6 +190,7 @@ struct sqlite3_value { double r; /* Real value used when MEM_Real is set in flags */ i64 i; /* Integer value used when MEM_Int is set in flags */ int nZero; /* Used when bit MEM_Zero is set in flags */ + void *pPtr; /* Pointer when flags==MEM_Ptr|MEM_Null */ FuncDef *pDef; /* Used only when flags==MEM_Agg */ RowSet *pRowSet; /* Used only when flags==MEM_RowSet */ VdbeFrame *pFrame; /* Used when flags==MEM_Frame */ @@ -247,6 +248,7 @@ struct sqlite3_value { ** policy for Mem.z. The MEM_Term flag tells us whether or not the ** string is \000 or \u0000 terminated */ +#define MEM_Ptr 0x8000 /* u.pPtr is valid if type==SQLITE_NULL */ #define MEM_Term 0x0200 /* String rep is nul terminated */ #define MEM_Dyn 0x0400 /* Need to call Mem.xDel() on Mem.z */ #define MEM_Static 0x0800 /* Mem.z points to a static string */ @@ -269,7 +271,7 @@ struct sqlite3_value { ** Clear any existing type flags from a Mem and replace them with f */ #define MemSetTypeFlag(p, f) \ - ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero))|f) + ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero|MEM_Ptr))|f) /* ** Return true if a memory cell is not marked as invalid. This macro diff --git a/src/vdbeapi.c b/src/vdbeapi.c index bdc5f0320d..a134e7210b 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -199,6 +199,11 @@ unsigned int sqlite3_value_subtype(sqlite3_value *pVal){ Mem *pMem = (Mem*)pVal; return ((pMem->flags & MEM_Subtype) ? pMem->eSubtype : 0); } +void *sqlite3_value_pointer(sqlite3_value *pVal){ + Mem *p = (Mem*)pVal; + if( (p->flags&(MEM_TypeMask|MEM_Ptr))==(MEM_Null|MEM_Ptr) ) return p->u.pPtr; + return 0; +} const unsigned char *sqlite3_value_text(sqlite3_value *pVal){ return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8); } @@ -373,6 +378,13 @@ void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); sqlite3VdbeMemSetInt64(pCtx->pOut, iVal); } +void sqlite3_result_pointer(sqlite3_context *pCtx, void *pPtr){ + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); + sqlite3VdbeMemSetNull(pCtx->pOut); + assert( (pCtx->pOut->flags & (MEM_TypeMask|MEM_Ptr))==MEM_Null ); + pCtx->pOut->flags |= MEM_Ptr; + pCtx->pOut->u.pPtr = pPtr; +} void sqlite3_result_null(sqlite3_context *pCtx){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); sqlite3VdbeMemSetNull(pCtx->pOut); diff --git a/test/fts3snippet.test b/test/fts3snippet.test index 887011cd11..0d8e0b00ff 100644 --- a/test/fts3snippet.test +++ b/test/fts3snippet.test @@ -554,7 +554,9 @@ do_test 4.2 { }] } {64} - +do_execsql_test 4.3.1 { + SELECT quote(t4) FROM t4; +} {NULL NULL} set sqlite_fts3_enable_parentheses 0