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

Reply via email to