Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Early detection of too many columns in an index avoid a possible 16-bit signed integer overflow. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
8af0caeb6d1e55f66ad2f12af94845dc |
User & Date: | drh 2019-03-31 21:09:33.346 |
Context
2019-04-01
| ||
03:07 | Fix harmless compiler warnings seen with MSVC. (check-in: 6cf8b18ec2 user: mistachkin tags: trunk) | |
2019-03-31
| ||
21:09 | Early detection of too many columns in an index avoid a possible 16-bit signed integer overflow. (check-in: 8af0caeb6d user: drh tags: trunk) | |
18:17 | Add some missing VdbeCoverage() macros. (check-in: d03b611302 user: drh tags: trunk) | |
Changes
Changes to src/build.c.
︙ | ︙ | |||
3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 | pList = sqlite3ExprListAppend(pParse, 0, sqlite3ExprAlloc(db, TK_ID, &prevCol, 0)); if( pList==0 ) goto exit_create_index; assert( pList->nExpr==1 ); sqlite3ExprListSetSortOrder(pList, sortOrder); }else{ sqlite3ExprListCheckLength(pParse, pList, "index"); } /* Figure out how many bytes of space are required to store explicitly ** specified collation sequence names. */ for(i=0; i<pList->nExpr; i++){ Expr *pExpr = pList->a[i].pExpr; assert( pExpr!=0 ); if( pExpr->op==TK_COLLATE ){ nExtra += (1 + sqlite3Strlen30(pExpr->u.zToken)); } } /* ** Allocate the index structure. */ nName = sqlite3Strlen30(zName); nExtraCol = pPk ? pPk->nKeyCol : 1; pIndex = sqlite3AllocateIndexObject(db, pList->nExpr + nExtraCol, nName + nExtra + 1, &zExtra); if( db->mallocFailed ){ goto exit_create_index; } assert( EIGHT_BYTE_ALIGNMENT(pIndex->aiRowLogEst) ); assert( EIGHT_BYTE_ALIGNMENT(pIndex->azColl) ); | > > | 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 | pList = sqlite3ExprListAppend(pParse, 0, sqlite3ExprAlloc(db, TK_ID, &prevCol, 0)); if( pList==0 ) goto exit_create_index; assert( pList->nExpr==1 ); sqlite3ExprListSetSortOrder(pList, sortOrder); }else{ sqlite3ExprListCheckLength(pParse, pList, "index"); if( pParse->nErr ) goto exit_create_index; } /* Figure out how many bytes of space are required to store explicitly ** specified collation sequence names. */ for(i=0; i<pList->nExpr; i++){ Expr *pExpr = pList->a[i].pExpr; assert( pExpr!=0 ); if( pExpr->op==TK_COLLATE ){ nExtra += (1 + sqlite3Strlen30(pExpr->u.zToken)); } } /* ** Allocate the index structure. */ nName = sqlite3Strlen30(zName); nExtraCol = pPk ? pPk->nKeyCol : 1; assert( pList->nExpr + nExtraCol <= 32767 /* Fits in i16 */ ); pIndex = sqlite3AllocateIndexObject(db, pList->nExpr + nExtraCol, nName + nExtra + 1, &zExtra); if( db->mallocFailed ){ goto exit_create_index; } assert( EIGHT_BYTE_ALIGNMENT(pIndex->aiRowLogEst) ); assert( EIGHT_BYTE_ALIGNMENT(pIndex->azColl) ); |
︙ | ︙ |
Changes to test/createtab.test.
︙ | ︙ | |||
8 9 10 11 12 13 14 | # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing that it is OK to create new tables # and indices while creating existing tables and indices. # | < | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing that it is OK to create new tables # and indices while creating existing tables and indices. # set testdir [file dirname $argv0] source $testdir/tester.tcl ifcapable autovacuum { set upperBound 2 } else { |
︙ | ︙ | |||
138 139 140 141 142 143 144 | execsql { SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1 } } {t1 t2 t3 t4} integrity_check createtab-$av.40 } | | > > > > > > > > > | 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | execsql { SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1 } } {t1 t2 t3 t4} integrity_check createtab-$av.40 } # 2019-03-31 Ensure that a proper error is returned for an index # with too many columns. # do_test createtab-3.1 { db eval {DROP TABLE IF EXISTS t1;} set sql "CREATE TABLE t1(x,UNIQUE(x[string repeat ,x 100000]))" catchsql $sql } {1 {too many columns in index}} finish_test |