Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix some broken asserts in btree.c and vdbeaux.c that may fail following an OOM error. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | threads |
Files: | files | file ages | folders |
SHA1: |
e15f47064bef431c0afd8bf93eb4e160 |
User & Date: | dan 2014-05-02 17:12:41.912 |
Context
2014-05-02
| ||
18:05 | Merge orderby-planning with this branch. (check-in: d9549de317 user: dan tags: threads) | |
17:12 | Fix some broken asserts in btree.c and vdbeaux.c that may fail following an OOM error. (check-in: e15f47064b user: dan tags: threads) | |
16:03 | Remove a faulty assert() from vdbesort.c. (check-in: d95d68aa1d user: dan tags: threads) | |
Changes
Changes to src/btree.c.
︙ | ︙ | |||
4731 4732 4733 4734 4735 4736 4737 | goto moveto_finish; } c = xRecordCompare(nCell, pCellKey, pIdxKey, 0); sqlite3_free(pCellKey); } assert( (pIdxKey->errCode!=SQLITE_CORRUPT || c==0) | | | 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 | goto moveto_finish; } c = xRecordCompare(nCell, pCellKey, pIdxKey, 0); sqlite3_free(pCellKey); } assert( (pIdxKey->errCode!=SQLITE_CORRUPT || c==0) && (pIdxKey->errCode!=SQLITE_NOMEM || pCur->pBtree->db->mallocFailed) ); if( c<0 ){ lwr = idx+1; }else if( c>0 ){ upr = idx-1; }else{ assert( c==0 ); |
︙ | ︙ |
Changes to src/vdbeaux.c.
︙ | ︙ | |||
3589 3590 3591 3592 3593 3594 3595 | ** the following assert(). If the assert() fails, it indicates a ** memory leak and a need to call sqlite3VdbeMemRelease(&mem1). */ assert( mem1.zMalloc==0 ); /* rc==0 here means that one or both of the keys ran out of fields and ** all the fields up to that point were equal. Return the the default_rc ** value. */ | | > | 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 | ** the following assert(). If the assert() fails, it indicates a ** memory leak and a need to call sqlite3VdbeMemRelease(&mem1). */ assert( mem1.zMalloc==0 ); /* rc==0 here means that one or both of the keys ran out of fields and ** all the fields up to that point were equal. Return the the default_rc ** value. */ assert( CORRUPT_DB || pKeyInfo->db==0 || pPKey2->default_rc==vdbeRecordCompareDebug(nKey1, pKey1, pPKey2) || pKeyInfo->db->mallocFailed ); return pPKey2->default_rc; } /* ** This function is an optimized version of sqlite3VdbeRecordCompare() ** that (a) the first field of pPKey2 is an integer, and (b) the |
︙ | ︙ | |||
3688 3689 3690 3691 3692 3693 3694 | res = sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2, 1); }else{ /* The first fields of the two keys are equal and there are no trailing ** fields. Return pPKey2->default_rc in this case. */ res = pPKey2->default_rc; } | > | | | 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 | res = sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2, 1); }else{ /* The first fields of the two keys are equal and there are no trailing ** fields. Return pPKey2->default_rc in this case. */ res = pPKey2->default_rc; } assert( pPKey2->pKeyInfo->db==0 || (res==0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)==0) || (res<0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)<0) || (res>0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)>0) || CORRUPT_DB || pPKey2->pKeyInfo->db->mallocFailed ); return res; } /* ** This function is an optimized version of sqlite3VdbeRecordCompare() ** that (a) the first field of pPKey2 is a string, that (b) the first field |
︙ | ︙ | |||
3752 3753 3754 3755 3756 3757 3758 | }else if( res>0 ){ res = pPKey2->r2; }else{ res = pPKey2->r1; } } | > | | | 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 | }else if( res>0 ){ res = pPKey2->r2; }else{ res = pPKey2->r1; } } assert( pPKey2->pKeyInfo->db==0 || (res==0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)==0) || (res<0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)<0) || (res>0 && vdbeRecordCompareDebug(nKey1, pKey1, pPKey2)>0) || CORRUPT_DB || pPKey2->pKeyInfo->db->mallocFailed ); return res; } /* ** Return a pointer to an sqlite3VdbeRecordCompare() compatible function ** suitable for comparing serialized records to the unpacked record passed |
︙ | ︙ |
Changes to test/malloc.test.
︙ | ︙ | |||
897 898 899 900 901 902 903 904 905 906 907 908 909 910 | execsql { SELECT * FROM t1 ORDER BY 1 COLLATE utf16bin; } } -test { faultsim_test_result {0 {abcde fghij klmno pqrst uvwxy}} faultsim_integrity_check } # Ensure that no file descriptors were leaked. do_test malloc-99.X { catch {db close} set sqlite_open_file_count } {0} | > > > > > > > > > > > > > > > > > > > > | 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 | execsql { SELECT * FROM t1 ORDER BY 1 COLLATE utf16bin; } } -test { faultsim_test_result {0 {abcde fghij klmno pqrst uvwxy}} faultsim_integrity_check } reset_db add_test_utf16bin_collate db set big [string repeat x 200] do_execsql_test 41.1 { DROP TABLE IF EXISTS t1; CREATE TABLE t1(a COLLATE utf16bin); INSERT INTO t1 VALUES('fghij' || $::big); INSERT INTO t1 VALUES('pqrst' || $::big); INSERT INTO t1 VALUES('abcde' || $::big); INSERT INTO t1 VALUES('uvwxy' || $::big); INSERT INTO t1 VALUES('klmno' || $::big); CREATE INDEX i1 ON t1(a); } do_faultsim_test 41.2 -faults oom* -body { execsql { SELECT * FROM t1 WHERE a = ('abcde' || $::big)} } -test { faultsim_test_result [list 0 "abcde$::big"] faultsim_integrity_check } # Ensure that no file descriptors were leaked. do_test malloc-99.X { catch {db close} set sqlite_open_file_count } {0} |
︙ | ︙ |