OK, thanks, will have to study this carefully. So, if I understand you well then the way I do it now I would need sqlite3_free?
Not sure it is helpful, but this is the callback procedure as I have it. It will find a specified string (second argument in SQL) in the supplied field value (first argument) and produce a string as in the first argument string, but leaving out all starting at the start of the second argument string. I know all this can be done quite simple with the built-in function substr and instr and that is probably faster, but I just use this as test code: Sub ClearStartAtStringX(ByVal lPtr_ObjContext As Long, _ ByVal lArgCount As Long, _ ByVal lPtr_ObjSQLite3_Value As Long) Dim lPtr1 As Long Dim lPtr2 As Long Dim lPtr3 As Long Dim lPtr4 As Long Dim str As String Dim str2 As String Dim lPos As Long Dim lBytes As Long 'field value to alter '-------------------- 10 lPtr1 = MemLong(lPtr_ObjSQLite3_Value) 'copy pointer 20 lPtr2 = sqlite3_value_text(lPtr1) 30 lBytes = sqlite3_value_bytes(lPtr1) 40 If lBytes = 0 Then 50 sqlite3_result_null lPtr_ObjContext 60 Exit Sub 70 End If 'produce normal VB Unicode string 80 str = cSQL.PointerToString(lPtr2, CP_UTF8, lBytes, lBytes) 'clear after finding this string '------------------------------- 90 lPtr3 = MemLong(lPtr_ObjSQLite3_Value + 4) 'copy pointer 100 lPtr4 = sqlite3_value_text(lPtr3) 110 lBytes = sqlite3_value_bytes(lPtr3) 'produce normal VB Unicode string 120 str2 = cSQL.PointerToString(lPtr4, CP_UTF8, lBytes, lBytes) 130 lPos = InStr(1, str, str2, vbBinaryCompare) 'VB instr function 'string not found, so return original field string '------------------------------------------------- 140 If lPos = 0 Then 150 sqlite3_result_value lPtr_ObjContext, lPtr1 160 Exit Sub 170 End If 180 sqlite3_result_text lPtr_ObjContext, StrPtr(str), _ (lPos - 2) * 2, SQLITE_TRANSIENT End Sub RBS On Mon, Dec 14, 2015 at 9:00 PM, Igor Tandetnik <igor at tandetnik.org> wrote: > On 12/14/2015 3:09 PM, Bart Smissaert wrote: > >> It could be either a pointer to sqlite3_value_text of sqlite3_value* >> > > No it can't be. sqlite3_result_text takes a char*, not a sqlite3_value* or > a const unsigned char*(*)(sqlite3_value*) > > If you are saying that you plan to obtain the character pointer by calling > sqlite3_value_text, then pass that exact pointer to sqlite3_result_text, > then I would suggest you use sqlite3_result_value instead: it takes > sqlite3_value* directly. If you insist on round-tripping through > sqlite3_value_text, then you must pass SQLITE_TRANSIENT for the last > parameter - the pointer returned by sqlite3_value_text is only guaranteed > to be valid until the custom function returns. > > or it could be a pointer to a locally declared variable >> > > In this case, you would also use SQLITE_TRANSIENT. > > -- > Igor Tandetnik > > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >