On Thu, Mar 25, 2010 at 10:22 AM, Martin Wilck <martin.wi...@ts.fujitsu.com>wrote:
> Hello, > > with sqlite 3.6.23 with SQLITE_ENABLE_STAT2, I get > an "out of memory" error running the following simple SQL code: > > CREATE TABLE dist_T ( > d_row INTEGER PRIMARY KEY, > dist TEXT UNIQUE NOT NULL > ); > > INSERT INTO dist_T VALUES (NULL, ''); > INSERT INTO dist_T VALUES (NULL, 'a'); > INSERT INTO dist_T VALUES (NULL, 'b'); > INSERT INTO dist_T VALUES (NULL, 'c'); > INSERT INTO dist_T VALUES (NULL, 'd'); > INSERT INTO dist_T VALUES (NULL, 'e'); > INSERT INTO dist_T VALUES (NULL, 'f'); > INSERT INTO dist_T VALUES (NULL, 'g'); > INSERT INTO dist_T VALUES (NULL, 'h'); > INSERT INTO dist_T VALUES (NULL, 'i'); > > ANALYZE; > > > This is always reproducable if dist_T contains 10 or more rows. With 0-9 > rows, I don't see the problem. Also not if SQLITE_ENABLE_STAT2 is not set. > > The problem happens when interpreting the results of "SELECT > idx,sampleno,sample FROM 'main'.sqlite_stat2".on line 66154 in sqlite3.c > (sqlite3AnalysisLoad()), apparently because > sqlite3_column_bytes() returned a size of 0 bytes for column 2 in line > 66145: > > 66145 int n = sqlite3_column_bytes(pStmt, 2); > 66146 if( n>24 ){ > 66147 n = 24; > 66148 } > 66149 pSample->nByte = (u8)n; > 66150 pSample->u.z = sqlite3DbMallocRaw(dbMem, n); > 66151 if( pSample->u.z ){ > 66152 memcpy(pSample->u.z, z, n); > 66153 }else{ > 66154 db->mallocFailed = 1; > 66155 break; > 66156 } > > I am including some gdb output. Note that pResultSet[2].n = 0. > > (gdb) bt > #0 sqlite3AnalysisLoad (db=0x55af68, iDb=0) at sqlite3.c:66154 > #1 0x00002af0c5884bd8 in sqlite3VdbeExec (p=0x569e38) at sqlite3.c:57585 > #2 0x00002af0c587c02d in sqlite3Step (p=0x569e38) at sqlite3.c:51342 > #3 0x00002af0c587c249 in sqlite3_step (pStmt=0x569e38) at sqlite3.c:51402 > #4 0x0000000000403eea in shell_exec (db=0x55af68, zSql=0x55aee0 > "ANALYZE;", > xCallback=0x402ba1 <shell_callback>, pArg=0x7fffe5377850, > pzErrMsg=0x7fffe5375aa8) at shell.c:1012 > #5 0x0000000000408019 in process_input (p=0x7fffe5377850, in=0x55ab50) > at shell.c:2236 > #6 0x0000000000406d1a in do_meta_command (zLine=0x5537d0 ".read", > p=0x7fffe5377850) at shell.c:1860 > #7 0x0000000000407deb in process_input (p=0x7fffe5377850, in=0x0) at > shell.c:2195 > #8 0x0000000000409183 in main (argc=1, argv=0x7fffe5378eb8) at > shell.c:2616 > > > (gdb) p *pIdx > $4 = {zName = 0x56c23d "sqlite_autoindex_dist_T_1", nColumn = 1, > aiColumn = 0x56c230, aiRowEst = 0x56c234, > pTable = 0x56b328, tnum = 3, onError = 99 'c', autoIndex = 1 '\001', > zColAff = 0x56bce8 "ab", pNext = 0x0, > pSchema = 0x55bb88, aSortOrder = 0x56c23c "", azColl = 0x56c228, > aSample = 0x570058} > (gdb) p *((Vdbe*) pStmt) > > $5 = {db = 0x55af68, pPrev = 0x0, pNext = 0x569e38, nOp = 15, nOpAlloc = > 42, aOp = 0x570d88, nLabel = 4, > nLabelAlloc = 26, aLabel = 0x0, apArg = 0x570fd0, aColName = > 0x571188, pResultSet = 0x570ef0, nResColumn = 3, > nCursor = 1, apCsr = 0x570fd0, errorAction = 2 '\002', okVar = 0 > '\0', nVar = 0, aVar = 0x570fd0, > azVar = 0x570fd0, magic = 3186757027, nMem = 4, aMem = 0x570eb8, > cacheCtr = 3, pc = 8, rc = 0, zErrMsg = 0x0, > explain = 0 '\0', changeCntOn = 0 '\0', expired = 0 '\0', runOnlyOnce > = 0 '\0', minWriteFileFormat = 255 '377', > inVtabMethod = 0 '\0', usesStmtJournal = 0 '\0', readOnly = 1 '\001', > isPrepareV2 = 0 '\0', nChange = 0, > btreeMask = 1, startTime = 0, aMutex = {nMutex = 0, aBtree = {0x0 > <repeats 11 times>}}, aCounter = {0, 0}, > zSql = 0x5685b0 "SELECT idx,sampleno,sample FROM > 'main'.sqlite_stat2", pFree = 0x0, nFkConstraint = 0, > nStmtDefCons = 0, iStatement = 0, pFrame = 0x0, nFrame = 0, expmask = 0} > > (gdb) p ((Vdbe*) pStmt)->pResultSet[0] > $8 = {u = {i = 0, nZero = 0, pDef = 0x0, pRowSet = 0x0, pFrame = 0x0}, r > = 0, db = 0x55af68, > z = 0x568fd8 "sqlite_autoindex_dist_T_1", n = 25, flags = 514, type = > 3 '\003', enc = 1 '\001', xDel = 0, > zMalloc = 0x568fd8 "sqlite_autoindex_dist_T_1"} > > (gdb) p ((Vdbe*) pStmt)->pResultSet[1] > $9 = {u = {i = 0, nZero = 0, pDef = 0x0, pRowSet = 0x0, pFrame = 0x0}, r > = 0, db = 0x55af68, z = 0x568208 "0", > n = 1, flags = 514, type = 3 '\003', enc = 1 '\001', xDel = 0, > zMalloc = 0x568208 "0"} > > (gdb) p ((Vdbe*) pStmt)->pResultSet[2] > $10 = {u = {i = 0, nZero = 0, pDef = 0x0, pRowSet = 0x0, pFrame = 0x0}, > r = 0, db = 0x55af68, z = 0x568bc8 "", > n = 0, flags = 514, type = 3 '\003', enc = 1 '\001', xDel = 0, > zMalloc = 0x568bc8 ""} > > > Regards > Martin > > > -- > Dr. Martin Wilck > PRIMERGY System Software Engineer > x86 Server Engineering > > Fujitsu Technology Solutions GmbH > Heinz-Nixdorf-Ring 1 > 33106 Paderborn, Germany > > Phone: ++49 5251 525 2796 > Fax: ++49 5251 525 2820 > Email: martin.wi...@ts.fujitsu.com > Internet: http://ts.fujitsu.com > Company Details: http://de.ts.fujitsu.com/imprint.html > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > Thanks for reporting this. It should be corrected by this fix: http://www.sqlite.org/src/info/cbd054fa6b -Shane _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users