Hi, Dennis,thank you very much for your advice. You are right. I do make some stupid mistake when I wrap the realloc() function for my os-less platform.
But now a new problem has emerged. sqlite3_exec(db, "create table myt(age smallint)", NULL, NULL, NULL); during the parser parsing the above line, it generates the some statement like this: UPDATE 'main'.sqlite_master xxxxxxx but when sqlite3Parser() begins to parse .sqlite_master, it generates an error like "near .s syntax error..." when I trace into parse.c, I find that the variable 'yyact' behaves weird. So, is it possible that this problem is also caused by the memory alllcator I wrapped? How can I set breakpoint to catch this bug? Thanks in advance. Sarah ---------------------------------------------------- >Sarah wrote: >> I'm facing new problems right now. the record cann't be inserted correctly >> when I execute the following statements. >> ...... >> char * database = ":memory:"; >> sqlite3 * db; >> sqlite3_open(database, &db); >> sqlite3_exec(db, "create table myt(name varchar(30),age smallint)", NULL, >> NULL, NULL); >> sqlite3_exec(db, "insert into myt values('sarah',27)", NULL, NULL, NULL); >> sqlite3_exec(db, "select * from myt", NULL, NULL, NULL); >> sqlite3_close(db); >> ...... >> >> The behavior is that , when executing "insert into myt values('sarah',27)", >> the program goes into the following statements in sqlite3RunParser() and >> returns >> SQLITE_NOMEM. How and why? >> ...... >> abort_parse: >> if( zSql[i]==0 && nErr==0 && pParse->rc==SQLITE_OK ){ >> if( lastTokenParsed!=TK_SEMI ){ >> sqlite3Parser(pEngine, TK_SEMI, pParse->sLastToken, pParse); >> pParse->zTail = &zSql[i]; >> } >> sqlite3Parser(pEngine, 0, pParse->sLastToken, pParse); >> } >> sqlite3ParserFree(pEngine, sqlite3FreeX); >> if( sqlite3MallocFailed() ){ >> pParse->rc = SQLITE_NOMEM; >> } >> ...... >> >> I totally have no idea of the principals of parser and how it works. Could >> someone tell me or give me some links? >> >> finally, a stupid question: >> should I add a semicolon at the end of the sql statement in sqlite3_exec(); >> Will that affect the execution of parser? >> >> >Sarah, > >First adding a semicolon at the end of your SQL statements will make no >difference. > >What happened was that sqlite ran out of memory at some point while >parsing your SQL. The sqlite3MallocFailed call simply checks if sqlite's >internal malloc has ever failed to get the requested memory. Since this >is a very simple SQL statement, the memory requirements for parsing >should be quite low. I would suspect a problem with your memory >allocator which is being called by sqlite through the standard malloc >API. You should be able to see where this is happening by setting a >breakpoint on sqlite3FailedMalloc in util.c and looking back through the >call stack. > >HTH >Dennis Cote > >----------------------------------------------------------------------------- >To unsubscribe, send email to [EMAIL PROTECTED] >----------------------------------------------------------------------------- > >