-C Enhance\sthe\scommand-line\sshell\swith\sthe\sability\sto\sset\sthe\nSQLITE_TESTCTRL_NEVER_CORRUPT\sflag\susing:\s".testctrl\snever_corrupt\s1".
-D 2015-01-19T15:05:54.471
+C An\salternative\sway\sof\sfixing\sthe\skey\scomparison\sbug\sof\nticket\s[f97c4637102a3ae72b].
+D 2015-01-19T19:21:36.662
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 5407a688f4d77a05c18a8142be8ae5a2829dd610
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F src/vdbe.h 6fc69d9c5e146302c56e163cb4b31d1ee64a18c3
F src/vdbeInt.h 9bb69ff2447c34b6ccc58b34ec35b615f86ead78
F src/vdbeapi.c 4bc511a46b9839392ae0e90844a71dc96d9dbd71
-F src/vdbeaux.c 07ef87c6d4b5abdf13ff33babb10205702fdab0a
+F src/vdbeaux.c a27240f5d800317c49ed06600c44402895999ee7
F src/vdbeblob.c 4af4bfb71f6df7778397b4a0ebc1879793276778
F src/vdbemem.c 31d8eabb0cd78bfeab4e5124c7363c3e9e54db9f
F src/vdbesort.c 6d64c5448b64851b99931ede980addc3af70d5e2
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 10321910990195878c0af1e94b34ae0cdc0cb31b
-R 1842536563f5d094d57991d4a5161858
+P 824328f9833d01fc155a9d0265ef41d338cf1ffb
+R 851e412f0bb1f167975796b44f8ba55a
+T *branch * alt1-tkt-f97c4637
+T *sym-alt1-tkt-f97c4637 *
+T -sym-trunk *
U drh
-Z b40ce48cd42cd2dd2358d0667c50be5c
+Z 89b67a6e4c6f42fba90e007874b16e43
i64 v = pPKey2->aMem[0].u.i;
i64 lhs;
- assert( (*(u8*)pKey1)<=0x3F || CORRUPT_DB );
+ if( ((const u8*)pKey1)[0]>=64 ){
+ return vdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 0);
+ }
switch( serial_type ){
case 1: { /* 1-byte signed integer */
lhs = ONE_BYTE_INT(aKey);
int serial_type;
int res;
+ if( aKey1[0]>=64 ){
+ return vdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 0);
+ }
getVarint32(&aKey1[1], serial_type);
if( serial_type<12 ){
res = pPKey2->r1; /* (pKey1/nKey1) is a number or a null */
** as the only argument.
*/
RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){
- /* varintRecordCompareInt() and varintRecordCompareString() both assume
- ** that the size-of-header varint that occurs at the start of each record
- ** fits in a single byte (i.e. is 127 or less). varintRecordCompareInt()
- ** also assumes that it is safe to overread a buffer by at least the
- ** maximum possible legal header size plus 8 bytes. Because there is
- ** guaranteed to be at least 74 (but not 136) bytes of padding following each
- ** buffer passed to varintRecordCompareInt() this makes it convenient to
- ** limit the size of the header to 64 bytes in cases where the first field
- ** is an integer.
- **
- ** The easiest way to enforce this limit is to consider only records with
- ** 13 fields or less. If the first field is an integer, the maximum legal
- ** header size is (12*5 + 1 + 1) bytes. */
- if( (p->pKeyInfo->nField + p->pKeyInfo->nXField)<=13 ){
- int flags = p->aMem[0].flags;
- if( p->pKeyInfo->aSortOrder[0] ){
- p->r1 = 1;
- p->r2 = -1;
- }else{
- p->r1 = -1;
- p->r2 = 1;
- }
- if( (flags & MEM_Int) ){
- return vdbeRecordCompareInt;
- }
- testcase( flags & MEM_Real );
- testcase( flags & MEM_Null );
- testcase( flags & MEM_Blob );
- if( (flags & (MEM_Real|MEM_Null|MEM_Blob))==0 && p->pKeyInfo->aColl[0]==0 ){
- assert( flags & MEM_Str );
- return vdbeRecordCompareString;
- }
+ int flags = p->aMem[0].flags;
+ if( p->pKeyInfo->aSortOrder[0] ){
+ p->r1 = 1;
+ p->r2 = -1;
+ }else{
+ p->r1 = -1;
+ p->r2 = 1;
+ }
+ if( (flags & MEM_Int) ){
+ return vdbeRecordCompareInt;
+ }
+ testcase( flags & MEM_Real );
+ testcase( flags & MEM_Null );
+ testcase( flags & MEM_Blob );
+ if( (flags & (MEM_Real|MEM_Null|MEM_Blob))==0 && p->pKeyInfo->aColl[0]==0 ){
+ assert( flags & MEM_Str );
+ return vdbeRecordCompareString;
}
-
return sqlite3VdbeRecordCompare;
}