On Wed, Dec 14, 2011 at 2:59 AM, Tod McQuillin <[email protected]> wrote:
> Hi all, > > I've found what appears to be a bug in SQLite 3.7.9 (as found in the > DBD::SQLite perl module version 1.35). > Already fixed. http://www.sqlite.org/src/info/54cc119811 > > Running the tests included with DBD::SQLite, I saw test failures and perl > crashing with a bus error while creating an index. > > Running the failing test under dbx, I observed the following: > > (dbx) run t/27_metadata.t > Running: perl t/27_metadata.t > (process id 12132) > Reading libc_psr.so.1 > 1..21 > Reading DBI.so > Reading Util.so > Reading SQLite.so > ok 1 - The object isa DBI::db > ok 2 - Create table meta1 > ok 3 - Create table meta2 > ok 4 - Create table meta3 > ok 5 - Get primary_key_info for meta1 > ok 6 - Correct primary_key_info returned for meta1 > ok 7 - Get primary_key_info for meta2 > ok 8 - Correct primary_key_info returned for meta2 > ok 9 - Get primary_key_info for meta3 > ok 10 - Correct primary_key_info returned for meta3 > t@1 (l@1) signal BUS (invalid address alignment) in sqlite3CreateIndex at > line 82187 in file "sqlite3.c" > 82187 pIndex->azColl[i] = zColl; > > Examining the data in more detail showed: > > (dbx) print *pIndex > *pIndex = { > zName = 0x10074d966 "sqlite_autoindex_meta4_1" > nColumn = 2 > aiColumn = 0x10074d95c > aiRowEst = 0x10074d940 > pTable = 0x100779558 > tnum = 0 > onError = 'c' > autoIndex = '\001' > bUnordered = '\0' > zColAff = (nil) > pNext = (nil) > pSchema = 0x1007390d8 > aSortOrder = 0x10074d964 "" > azColl = 0x10074d94c > } > > Note that pIndex->azColl is not aligned to an 8-byte boundary as required > by the sparc64 architecture. > > The following (ugly) patch resolves the problem for me, allowing > DBD::SQLite to pass all tests. Hopefuly an sqlite developer can make this > into something a bit prettier: > > --- DBD-SQLite-1.35/sqlite3.c~ 2011-11-28 18:05:51.000000000 -0600 > +++ DBD-SQLite-1.35/sqlite3.c 2011-12-14 01:29:41.523322000 -0600 > @@ -82103,7 +82103,7 @@ > nCol = pList->nExpr; > pIndex = sqlite3DbMallocZero(db, > sizeof(Index) + /* Index structure */ > - sizeof(tRowcnt)*(nCol+1) + /* Index.aiRowEst */ > + sizeof(tRowcnt)*(nCol+1+((**nCol+1)%2)) + /* Index.aiRowEst */ > sizeof(int)*nCol + /* Index.aiColumn */ > sizeof(char *)*nCol + /* Index.azColl */ > sizeof(u8)*nCol + /* Index.aSortOrder */ > @@ -82114,7 +82114,7 @@ > goto exit_create_index; > } > pIndex->aiRowEst = (tRowcnt*)(&pIndex[1]); > - pIndex->azColl = (char**)(&pIndex->aiRowEst[**nCol+1]); > + pIndex->azColl = (char**)(&pIndex->aiRowEst[**nCol+1+((nCol+1)%2)]); > pIndex->aiColumn = (int *)(&pIndex->azColl[nCol]); > pIndex->aSortOrder = (u8 *)(&pIndex->aiColumn[nCol]); > pIndex->zName = (char *)(&pIndex->aSortOrder[nCol]); > > Thanks and regards, > -- > Tod McQuillin > ______________________________**_________________ > sqlite-users mailing list > [email protected] > http://sqlite.org:8080/cgi-**bin/mailman/listinfo/sqlite-**users<http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users> > -- D. Richard Hipp [email protected] _______________________________________________ sqlite-users mailing list [email protected] http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

