--- sqlite-3.4.0/src/vdbe.c 2007/06/26 00:37:28 1.632 +++ sqlite-3.4.0-gentoo/src/vdbe.c 2007/06/26 11:13:26 1.633 @@ -1153,11 +1153,20 @@ case OP_Multiply: b *= a; break; case OP_Divide: { if( a==0 ) goto divide_by_zero; + /* Dividing the largest possible negative 64-bit integer (1<<63) by + ** -1 returns an integer to large to store in a 64-bit data-type. On + ** some architectures, the value overflows to (1<<63). On others, + ** a SIGFPE is issued. The following statement normalizes this + ** behaviour so that all architectures behave as if integer + ** overflow occured. + */ + if( a==-1 && b==(1<<63) ) a = 1; b /= a; break; } default: { if( a==0 ) goto divide_by_zero; + if( a==-1 ) a = 1; b %= a; break; } @@ -1184,6 +1193,7 @@ i64 ia = (i64)a; i64 ib = (i64)b; if( ia==0 ) goto divide_by_zero; + if( ia==-1 ) ia = 1; b = ib % ia; break; } --- sqlite-3.4.0/test/expr.test 2007/06/25 17:28:02 1.56 +++ sqlite-3.4.0-gentoo/test/expr.test 2007/06/26 11:13:27 1.57 @@ -139,6 +139,9 @@ test_expr expr-1.104 {i1=0} {(-9223372036854775808.0 % -1)} 0.0 test_expr expr-1.105 {i1=0} {(-9223372036854775808.0 / -1)>1} 1 +test_expr expr-1.106 {i1=0} {(1<<63)/-1} -9223372036854775808 +test_expr expr-1.107 {i1=0} {(1<<63)%-1} 0 + test_expr expr-2.1 {r1=1.23, r2=2.34} {r1+r2} 3.57 test_expr expr-2.2 {r1=1.23, r2=2.34} {r1-r2} -1.11 test_expr expr-2.3 {r1=1.23, r2=2.34} {r1*r2} 2.8782