On 2/9/07, Dennis Cote <[EMAIL PROTECTED]> wrote:
Jeffrey Rennie wrote: > I think the code in the next higher stackframe may be the culprit. > > I inserted a new line of code at vbde.c:2374 so it now reads: > > if( pOp->p2 ){ > assert( i==1 ); > sqlite3RollbackAll(db); > db->autoCommit = 1; > }else{ > db->autoCommit = i; > if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ > p->pTos = pTos; > p->pc = pc; > db->autoCommit = 1-i; > p->rc = SQLITE_BUSY; > return SQLITE_BUSY; > } > return SQLITE_OK == p->rc ? SQLITE_DONE : p->rc; // my new line > } > return SQLITE_DONE; > > > And sqlite_step() now returns SQLITE_FULL as I had expected. > Jeffrey, I'm a little suspicious of your fix. You said you are using version 3.3.4 and it only has the older version of sqlite_step which is documented as only returning a subset of the sqlite error codes at http://www.sqlite.org/capi3ref.html#sqlite3_step In the lagacy interface, the return value will be either SQLITE_BUSY, SQLITE_DONE, SQLITE_ROW, SQLITE_ERROR, or SQLITE_MISUSE. So it should never return SQLITE_FULL. Under a disk full condition it should return SQLITE_ERROR, and then you would get the SQLITE_FULL error when you called sqlite_reset (see the section Goofy Interface Alert).
Indeed, my fix does not conform to the documentation.
Nonetheless, you are saying you are getting an SQLITE_DONE when the disk is full.
Yes, I'm still seeing SQLITE_DONE when the disk is full. But thanks for the pointer to the Goofy Interface Alert! Even though the sqlite_step() returns SQLITE_DONE, the sqlite_finalize() call returns SQLITE_FULL, so I am able to detect the disk full situation. Thanks again! My problem is solved. -Jeffrey Rennie