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