]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add new interfaces sqlite3_result_pointer(), and
authordan <dan@noemail.net>
Wed, 19 Dec 2018 17:05:48 +0000 (17:05 +0000)
committerdan <dan@noemail.net>
Wed, 19 Dec 2018 17:05:48 +0000 (17:05 +0000)
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

ext/fts3/fts3.c
manifest
manifest.uuid
src/sqlite.h.in
src/vdbeInt.h
src/vdbeapi.c
test/fts3snippet.test

index 72deb18c1b857167cf9e3613d4a98eddedb0c50a..f9b911f91e2c15842b2eda36528b707a40c9b85f 100644 (file)
@@ -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;
 }
 
 /*
index de48e28835f510987138c7bae548eba30407ca5d..846082bdd5bae8f0eb8d163fbabc1282ae43405a 100644 (file)
--- 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
index c4e342984028c559ef478d4b902083e53cefc4a0..2ab94187ffbbf67452b10979689b223416aa7a36 100644 (file)
@@ -1 +1 @@
-de0781485701c138be58dcb0bb8eaa9dd2bad828ccafcc40db906f606d967639
\ No newline at end of file
+553a923c82e968104296253d07dc6e1219747d85ebb7b02640d33d7056418df4
\ No newline at end of file
index 4d54dcd7d76c32b67c9210efb2e70cdc48aa3394..1458eff0bda940f3f824b6a49838fc4bf4801be7 100644 (file)
@@ -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);
index 65e47c33f304fcfdb76140876d1acbb0aad135ef..e412dcfd0bcae5370e15c510f4a377c1d32b73b4 100644 (file)
@@ -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
index bdc5f0320d8f723360b8985699750b1fb8fc5f00..a134e7210b0d44470844abaec12eae3ee9b95fdc 100644 (file)
@@ -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);
index 887011cd1116bb117880fa4f5e6e6b5f5abc3ff6..0d8e0b00ff01bba591f44079347b5ba5fd5dc766 100644 (file)
@@ -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