On Wed, Dec 13, 2017 at 1:25 PM, petern <peter.nichvolo...@gmail.com> wrote:

> Dave. The documentation contains many such catch-all statements which do
> not reflect a full decision tree.  The usual cover story will either be (I
> paraphrase) : 1. "that's an implementation detail" or 2. "it might change
> later, so the documentation can only make a short blanket statement".
>
> It is far more likely that spelling and grammatical errors you report of
> the documentation will be corrected.
>
> The current decision tree of the particular catch-all documentation comment
> you found is in vdbemem.c at the comment and function body listing below.
> Ultimately there is only the source code.  Getting used to reading it for
> yourself will probably save you a lot of time.
>
> int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){
>   Mem *p = (Mem*)pVal;
>   assert( (p->flags & MEM_Null)==0 || (p->flags & (MEM_Str|MEM_Blob))==0 );
>   if( (p->flags & MEM_Str)!=0 && pVal->enc==enc ){
>     return p->n;
>   }
>   if( (p->flags & MEM_Blob)!=0 ){
>     if( p->flags & MEM_Zero ){
>       return p->n + p->u.nZero;
>     }else{
>       return p->n;
>     }
>   }
>   if( p->flags & MEM_Null ) return 0;
>   return valueBytes(pVal, enc);
>

it's valueBytes that has the biggest impact

sqlite3_value_blob
sqlite3_value_text
sqlite3_value_text16
sqlite3_value_text16be
sqlite3_value_text16le

sqlite3_value_bytes
   - invalidates sqlite3_value_text16*() result  (always)

sqlite3_value_bytes16
  - invalidates sqlite3_value_text() result (always)
  - invalidates sqlite3_value_text16*() result if the format does not match
defined SQLITE_UTF16NATIVE

if the value type is a blob, sqlite3_value_bytes() and
sqlite3_value_bytes16() will do no conversion, and will not invalidate blob
result.

for both; if the value was NULL there is no invalidation; and 0 will be
returned

if sqlite3_value_blob is used and the original value type is NOT a blob, it
returns sqlite3_value_text(); so bytes16 will invalidate the result.
(rephrased) sqlite3_value_blob() on a column that is not a blob has the
potential of being invalidated by bytes16().



}
>
> Peter
>
> On Wed, Dec 13, 2017 at 8:38 AM, dave <d...@ziggurat29.com> wrote:
>
> > I have a question regarding the API documention at
> > http://sqlite.org/c3ref/value_blob.html, which states:
> > "... the pointer returned from sqlite3_value_blob(), .. can be
> invalidated
> > by a subsequent call to sqlite3_value_bytes(), ..."
> > Is that statement still true?  I ask because I notice that the source of
> > many of the extensions in 'sqlite/ext' seem to violate that advice.
> >
> > I first noticed this when I was recently working on fileio.c (e.g. line
> 73
> > vs 77), but grepping through the source I find many other cases where the
> > pointer is retrieved via  *_blob() or *.text() BEFORE invoking
> > sqlite3_value_bytes().  E.g these source and line numbers:
> > fts2_tokenizer.c:71, 72
> > fts3_expr.c:1248, 1249
> > fts3_tokenizer.c:78, 79
> > fts3_tokenize_vtab.c:347, 348
> > fts3_write.c:5290, 5291
> > fts5_index.c:6270, 6271
> > fts5_storage.c:735, 736
> > fts5_tcl.c:547
> > fts5_test_tok.c:375, 376
> > fts5_vocab.c:607, 608; 612, 613; 616, 617
> > (I stopped grepping at this point; this list is not comprehensive).
> >
> > Anyway, just wondered if the api documentation's advice is maybe
> > out-of-date
> > with current reality.  Thoughts/comments?
> >
> > Cheers!
> > -dave
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users@mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> >
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to