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

Reply via email to