On 7/1/07, Rich Rattanni <[EMAIL PROTECTED]> wrote:

I was trying to look through the SQLITE source code to see how the
sqlite3_bind_blob routine worked.

sqlite3_bind_blob passes the data pointer to bindText
bindText passes the data pointer to sqlite3VdbeMemSetStr
sqlite3VdbeMemSetStr then does...
...
pMem->z = (char *)z;
  if( xDel==SQLITE_STATIC ){
    pMem->flags = MEM_Static;
  }else if( xDel==SQLITE_TRANSIENT ){
    pMem->flags = MEM_Ephem;
  }else{
    pMem->flags = MEM_Dyn;
    pMem->xDel = xDel;
  }
...

I dont see anywhere where sqlite3 copies data to a private buffer, I
just see where sqlite3 saves a copy of the user pointer.



Further down in that function, after setting MEM_Ephem, there are these
lines of code:

 if( pMem->flags&MEM_Ephem ){
   return sqlite3VdbeMemMakeWriteable(pMem);
 }

which does the memory copy when SQLITE_TRANSIENT is used as a side-effect of
making it "writable".

In your original outline you issued sqlite3_step before freeing the memory.
If you leave it that way, you can get away with SQLITE_STATIC when binding
the blob... which might indicate something by whether/where the crash still
occurs.

--andy
 just a sqlite user, not really a knower-of-code

Reply via email to