On 2/1/17, Shaobo He <polarish...@gmail.com> wrote: > Thanks for your reply. I repeated the experiment by setting > db->mallocFailed upon return. You are right that there is no segmentation > fault (there were some assertion failures: e.g, "sqlite3OomClear: Assertion > `db->lookaside.bDisable>0' failed"). Instead I got error messages saying > out of memory. It makes sense now. May I ask where the unwinding is done? > Does it mean the program stops execution at sqlite3SrcListAppend()? >
The assertion fault is probably because you are playing games with the memory allocator - pretending that a fault occurred when it did not. You might be able to work around that by compiling with -DSQLITE_OMIT_LOOKASIDE. An OOM in sqlite3SrcListAppend() will likely cause the parser to abort at https://www.sqlite.org/src/artifact/25ccc63ae?ln=547. The SQLite parser works by extracting tokens from the input string and sending them one by one into the pushdown automaton that implements the recognizes the LALR(1) grammar. If you break out of that loop, it stops the parser dead in its tracks. After that, all the left-over memory allocations are cleaned up and the tokenizer returns the SQLITE_NOMEM error. There are other places where a prior OOM can cause processing to abort. Grep for "mallocFailed" to find them. But the tokenizer loop is the most likely spot. -- D. Richard Hipp d...@sqlite.org _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users