diff options
author | drh <drh@noemail.net> | 2011-11-14 02:53:54 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2011-11-14 02:53:54 +0000 |
commit | e09b84c558d09956e29467a3ed70018b4c6f7aca (patch) | |
tree | 85c0481456573ea7df297107a3adee0a71d9b9b1 /src | |
parent | 75e700c100f429c544e12b35d2ab2b13457807b5 (diff) | |
download | sqlite-e09b84c558d09956e29467a3ed70018b4c6f7aca.tar.gz sqlite-e09b84c558d09956e29467a3ed70018b4c6f7aca.zip |
Fix a 8-byte alignment problem that causes a SIGBUS on Sparc.
FossilOrigin-Name: 54cc11981127b52145e39f551d958580b1d45169
Diffstat (limited to 'src')
-rw-r--r-- | src/build.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/build.c b/src/build.c index e23aab6b1..46512f8e3 100644 --- a/src/build.c +++ b/src/build.c @@ -2661,19 +2661,22 @@ Index *sqlite3CreateIndex( nName = sqlite3Strlen30(zName); nCol = pList->nExpr; pIndex = sqlite3DbMallocZero(db, - sizeof(Index) + /* Index structure */ - sizeof(tRowcnt)*(nCol+1) + /* Index.aiRowEst */ - sizeof(int)*nCol + /* Index.aiColumn */ - sizeof(char *)*nCol + /* Index.azColl */ - sizeof(u8)*nCol + /* Index.aSortOrder */ - nName + 1 + /* Index.zName */ - nExtra /* Collation sequence names */ + sizeof(Index) + /* Index structure */ + ROUND8(sizeof(tRowcnt)*(nCol+1)) + /* Index.aiRowEst */ + sizeof(char *)*nCol + /* Index.azColl */ + sizeof(int)*nCol + /* Index.aiColumn */ + sizeof(u8)*nCol + /* Index.aSortOrder */ + nName + 1 + /* Index.zName */ + nExtra /* Collation sequence names */ ); if( db->mallocFailed ){ goto exit_create_index; } pIndex->aiRowEst = (tRowcnt*)(&pIndex[1]); - pIndex->azColl = (char**)(&pIndex->aiRowEst[nCol+1]); + pIndex->azColl = (char**) + ((char*)pIndex->aiRowEst + ROUND8(sizeof(tRowcnt)*nCol+1)); + assert( EIGHT_BYTE_ALIGNMENT(pIndex->aiRowEst) ); + assert( EIGHT_BYTE_ALIGNMENT(pIndex->azColl) ); pIndex->aiColumn = (int *)(&pIndex->azColl[nCol]); pIndex->aSortOrder = (u8 *)(&pIndex->aiColumn[nCol]); pIndex->zName = (char *)(&pIndex->aSortOrder[nCol]); |