Fix Windows build.

modified:   Makefile
	modified:   all_test.go
	modified:   internal/bin/bin_linux_386.go
	modified:   internal/bin/bin_linux_amd64.go
	new file:   z_linux_test.go
This commit is contained in:
Jan Mercl
2017-07-04 17:14:51 +02:00
parent 2aa5e95243
commit 91382a8425
5 changed files with 394 additions and 315 deletions

View File

@@ -20,7 +20,7 @@ all: editor
clean: clean:
go clean go clean
rm -f *~ *.test *.out test.db* tt4-test*.db* rm -f *~ *.test *.out test.db* tt4-test*.db* test_sv.* testdb-*
cover: cover:
t=$(shell tempfile) ; go test -coverprofile $$t && go tool cover -html $$t && unlink $$t t=$(shell tempfile) ; go test -coverprofile $$t && go tool cover -html $$t && unlink $$t

View File

@@ -11,11 +11,9 @@ import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"os" "os"
"os/exec"
"path" "path"
"path/filepath" "path/filepath"
"runtime" "runtime"
"strconv"
"strings" "strings"
"testing" "testing"
"time" "time"
@@ -351,267 +349,3 @@ func TestMemDB(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
} }
func TestMP(t *testing.T) {
dir, err := ioutil.TempDir("", "sqlite-test-")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}()
wd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.Chdir(wd); err != nil {
t.Fatal(err)
}
}()
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
if out, err := exec.Command("go", "build", "-o", "mptest", "github.com/cznic/sqlite/internal/mptest").CombinedOutput(); err != nil {
t.Fatalf("go build mptest: %s\n%s", err, out)
}
pat := filepath.Join(wd, filepath.FromSlash("testdata/mptest"), "*.test")
m, err := filepath.Glob(pat)
if err != nil {
t.Fatal(err)
}
if len(m) == 0 {
t.Fatalf("%s: no files", pat)
}
nm := filepath.FromSlash("./mptest")
for _, v := range m {
os.Remove("db")
out, err := exec.Command(nm, "db", v).CombinedOutput()
t.Logf("%s", out)
if err != nil {
t.Fatal(err)
}
}
}
func TestThread1(t *testing.T) {
for i := 0; i < 10; i++ {
dir, err := ioutil.TempDir("", "sqlite-test-")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}()
wd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.Chdir(wd); err != nil {
t.Fatal(err)
}
}()
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
if out, err := exec.Command("go", "build", "-o", "threadtest1", "github.com/cznic/sqlite/internal/threadtest1").CombinedOutput(); err != nil {
t.Fatalf("go build mptest: %s\n%s", err, out)
}
for j := 0; j <= 20; j++ {
out, err := exec.Command("./threadtest1", strconv.Itoa(j), "-v").CombinedOutput()
t.Logf("%v, %v:\n%s", i, j, out)
if err != nil {
t.Fatal(err)
}
}
}
}
func TestThread2(t *testing.T) {
dir, err := ioutil.TempDir("", "sqlite-test-")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}()
wd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.Chdir(wd); err != nil {
t.Fatal(err)
}
}()
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
if out, err := exec.Command("go", "build", "-o", "threadtest2", "github.com/cznic/sqlite/internal/threadtest2").CombinedOutput(); err != nil {
t.Fatalf("go build mptest: %s\n%s", err, out)
}
out, err := exec.Command("./threadtest2").CombinedOutput()
t.Logf("%s", out)
if err != nil {
t.Fatal(err)
}
}
func TestThread3(t *testing.T) {
dir, err := ioutil.TempDir("", "sqlite-test-")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}()
wd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.Chdir(wd); err != nil {
t.Fatal(err)
}
}()
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
s := []string{"build", "-o", "threadtest3"}
if *memTrace {
s = append(s, "-tags", "memory.trace", "-race")
}
if out, err := exec.Command("go", append(s, "github.com/cznic/sqlite/internal/threadtest3")...).CombinedOutput(); err != nil {
t.Fatalf("go build mptest: %s\n%s", err, out)
}
for _, opts := range [][]string{
{"walthread1"},
{"walthread2"},
{"walthread3"},
{"walthread4"},
{"walthread5"},
{"cgt_pager_1"},
{"dynamic_triggers"},
{"checkpoint_starvation_1"},
{"checkpoint_starvation_2"},
{"create_drop_index_1"},
{"lookaside1"},
{"vacuum1"},
{"stress1"},
{"stress2"},
} {
out, err := exec.Command("./threadtest3", opts...).CombinedOutput()
dbg("%v\n%s", opts, out)
t.Logf("%v\n%s", opts, out)
if err != nil {
t.Fatal(err)
}
if bytes.Contains(out, []byte("fault address")) ||
bytes.Contains(out, []byte("data race")) ||
bytes.Contains(out, []byte("RACE")) {
t.Fatal("fault")
}
}
}
func TestThread4(t *testing.T) {
cases := 0
for i := 0; i < 10; i++ {
dir, err := ioutil.TempDir("", "sqlite-test-")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}()
wd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.Chdir(wd); err != nil {
t.Fatal(err)
}
}()
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
s := []string{"build", "-o", "threadtest4"}
if *memTrace {
s = append(s, "-tags", "memory.trace", "-race")
}
if out, err := exec.Command("go", append(s, "github.com/cznic/sqlite/internal/threadtest4")...).CombinedOutput(); err != nil {
t.Fatalf("go build mptest: %s\n%s", err, out)
}
for _, opts := range [][]string{
{},
{"-wal"},
{"-serialized"},
{"-serialized", "-wal"},
{"--multithread"},
{"--multithread", "-wal"},
{"--multithread", "-serialized"},
{"--multithread", "-serialized", "-wal"},
} {
for j := 2; j <= 20; j++ {
out, err := exec.Command("./threadtest4", append(opts, strconv.Itoa(j))...).CombinedOutput()
t.Logf("%v %v: %v\n%s", i, j, opts, out)
if err != nil {
t.Fatal(err)
}
if bytes.Contains(out, []byte("fault address")) ||
bytes.Contains(out, []byte("data race")) ||
bytes.Contains(out, []byte("RACE")) {
t.Fatalf("case %v: fault", cases)
}
cases++
}
}
}
t.Logf("cases: %v", cases)
}

View File

@@ -56973,10 +56973,14 @@ _29:
if (int32(_pRhs.X1) & i32(2)) == 0 { if (int32(_pRhs.X1) & i32(2)) == 0 {
goto _40 goto _40
} }
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(_idx1))), &_4_serial_type) return func() int32 {
_4_serial_type = uint32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(_idx1))), &_4_serial_type))
}() }()
if _4_serial_type < uint32(i32(12)) { if _4_serial_type < uint32(i32(12)) {
_rc = i32(-1) _rc = i32(-1)
@@ -57022,10 +57026,14 @@ _40:
crt.X__builtin_abort(tls) crt.X__builtin_abort(tls)
} }
}() }()
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(_idx1))), &_4_serial_type) return func() int32 {
_4_serial_type = uint32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(_idx1))), &_4_serial_type))
}() }()
if (_4_serial_type < uint32(i32(12))) || ((_4_serial_type & uint32(i32(1))) != 0) { if (_4_serial_type < uint32(i32(12))) || ((_4_serial_type & uint32(i32(1))) != 0) {
_rc = i32(-1) _rc = i32(-1)
@@ -57402,10 +57410,14 @@ func _vdbeRecordCompareString(tls *crt.TLS, _nKey1 int32, _pKey1 unsafe.Pointer,
} }
}() }()
_vdbeAssertFieldCountWithinLimits(tls, _nKey1, _pKey1, (*XKeyInfo)(_pPKey2.X0)) _vdbeAssertFieldCountWithinLimits(tls, _nKey1, _pKey1, (*XKeyInfo)(_pPKey2.X0))
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(i32(1))))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(i32(1))))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_serial_type))) return func() int32 {
_serial_type = int32(uint32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(i32(1))))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_serial_type))))
}() }()
if _serial_type < i32(12) { if _serial_type < i32(12) {
_res = int32(_pPKey2.X5) _res = int32(_pPKey2.X5)
@@ -65291,16 +65303,24 @@ func _vdbeSorterCompareText(tls *crt.TLS, _pTask *XSortSubtask, _pbKey2Cached *i
_p2 = (*uint8)(_pKey2) _p2 = (*uint8)(_pKey2)
_v1 = (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(0))))))) _v1 = (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(0)))))))
_v2 = (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(0))))))) _v2 = (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(0)))))))
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(1))))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(1))))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_n1))) return func() int32 {
_n1 = int32(uint32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(1))))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_n1))))
}() }()
_n1 = (_n1 - i32(13)) / i32(2) _n1 = (_n1 - i32(13)) / i32(2)
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(1))))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(1))))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_n2))) return func() int32 {
_n2 = int32(uint32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(1))))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_n2))))
}() }()
_n2 = (_n2 - i32(13)) / i32(2) _n2 = (_n2 - i32(13)) / i32(2)
_res = crt.Xmemcmp(tls, (unsafe.Pointer)(_v1), (unsafe.Pointer)(_v2), uint32(func() int32 { _res = crt.Xmemcmp(tls, (unsafe.Pointer)(_v1), (unsafe.Pointer)(_v2), uint32(func() int32 {
@@ -67208,10 +67228,14 @@ func _sqlite3VdbeSorterWrite(tls *crt.TLS, _pCsr *XVdbeCursor, _pVal *XMem) (r0
} }
}() }()
_pSorter = (*XVdbeSorter)(*(*unsafe.Pointer)(unsafe.Pointer((*t46)(unsafe.Pointer(&(_pCsr.X14)))))) _pSorter = (*XVdbeSorter)(*(*unsafe.Pointer)(unsafe.Pointer((*t46)(unsafe.Pointer(&(_pCsr.X14))))))
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5)) + 1*uintptr(i32(1))))))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5)) + 1*uintptr(i32(1))))))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5))+1*uintptr(i32(1)))))), (*uint32)(unsafe.Pointer(&_t))) return func() int32 {
_t = int32(uint32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5)) + 1*uintptr(i32(1))))))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5))+1*uintptr(i32(1)))))), (*uint32)(unsafe.Pointer(&_t))))
}() }()
if ((_t > i32(0)) && (_t < i32(10))) && (_t != i32(7)) { if ((_t > i32(0)) && (_t < i32(10))) && (_t != i32(7)) {
{ {
@@ -67355,18 +67379,23 @@ func _sqlite3VdbeIdxRowid(tls *crt.TLS, _db *Xsqlite3, _pCur *XBtCursor, _rowid
if _rc != 0 { if _rc != 0 {
return _rc return _rc
} }
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(_m.X5))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(_m.X5))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(_m.X5)), &_szHdr) return func() int32 { _szHdr = uint32(*(*uint8)(unsafe.Pointer(_m.X5))); return i32(1) }()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(_m.X5)), &_szHdr))
}() }()
if (_szHdr < uint32(i32(3))) || (int32(_szHdr) > (_m.X4)) { if (_szHdr < uint32(i32(3))) || (int32(_szHdr) > (_m.X4)) {
goto _idx_rowid_corruption goto _idx_rowid_corruption
} }
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5)) + 1*uintptr(_szHdr-uint32(i32(1)))))))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5)) + 1*uintptr(_szHdr-uint32(i32(1)))))))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5))+1*uintptr(_szHdr-uint32(i32(1))))))), &_typeRowid) return func() int32 {
_typeRowid = uint32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5)) + 1*uintptr(_szHdr-uint32(i32(1))))))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5))+1*uintptr(_szHdr-uint32(i32(1))))))), &_typeRowid))
}() }()
if ((_typeRowid < uint32(i32(1))) || (_typeRowid > uint32(i32(9)))) || (_typeRowid == uint32(i32(7))) { if ((_typeRowid < uint32(i32(1))) || (_typeRowid > uint32(i32(9)))) || (_typeRowid == uint32(i32(7))) {
goto _idx_rowid_corruption goto _idx_rowid_corruption

View File

@@ -56982,10 +56982,14 @@ _29:
if (int32(_pRhs.X1) & i32(2)) == 0 { if (int32(_pRhs.X1) & i32(2)) == 0 {
goto _40 goto _40
} }
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(_idx1))), &_4_serial_type) return func() int32 {
_4_serial_type = uint32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(_idx1))), &_4_serial_type))
}() }()
if _4_serial_type < uint32(i32(12)) { if _4_serial_type < uint32(i32(12)) {
_rc = i32(-1) _rc = i32(-1)
@@ -57031,10 +57035,14 @@ _40:
crt.X__builtin_abort(tls) crt.X__builtin_abort(tls)
} }
}() }()
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(_idx1))), &_4_serial_type) return func() int32 {
_4_serial_type = uint32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(_idx1))), &_4_serial_type))
}() }()
if (_4_serial_type < uint32(i32(12))) || ((_4_serial_type & uint32(i32(1))) != 0) { if (_4_serial_type < uint32(i32(12))) || ((_4_serial_type & uint32(i32(1))) != 0) {
_rc = i32(-1) _rc = i32(-1)
@@ -57411,10 +57419,14 @@ func _vdbeRecordCompareString(tls *crt.TLS, _nKey1 int32, _pKey1 unsafe.Pointer,
} }
}() }()
_vdbeAssertFieldCountWithinLimits(tls, _nKey1, _pKey1, (*XKeyInfo)(_pPKey2.X0)) _vdbeAssertFieldCountWithinLimits(tls, _nKey1, _pKey1, (*XKeyInfo)(_pPKey2.X0))
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(i32(1))))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(i32(1))))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_serial_type))) return func() int32 {
_serial_type = int32(uint32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(i32(1))))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_serial_type))))
}() }()
if _serial_type < i32(12) { if _serial_type < i32(12) {
_res = int32(_pPKey2.X5) _res = int32(_pPKey2.X5)
@@ -65300,16 +65312,24 @@ func _vdbeSorterCompareText(tls *crt.TLS, _pTask *XSortSubtask, _pbKey2Cached *i
_p2 = (*uint8)(_pKey2) _p2 = (*uint8)(_pKey2)
_v1 = (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(0))))))) _v1 = (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(0)))))))
_v2 = (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(0))))))) _v2 = (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(0)))))))
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(1))))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(1))))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_n1))) return func() int32 {
_n1 = int32(uint32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(1))))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_n1))))
}() }()
_n1 = (_n1 - i32(13)) / i32(2) _n1 = (_n1 - i32(13)) / i32(2)
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(1))))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(1))))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_n2))) return func() int32 {
_n2 = int32(uint32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(1))))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2))+1*uintptr(i32(1)))), (*uint32)(unsafe.Pointer(&_n2))))
}() }()
_n2 = (_n2 - i32(13)) / i32(2) _n2 = (_n2 - i32(13)) / i32(2)
_res = crt.Xmemcmp(tls, (unsafe.Pointer)(_v1), (unsafe.Pointer)(_v2), uint64(func() int32 { _res = crt.Xmemcmp(tls, (unsafe.Pointer)(_v1), (unsafe.Pointer)(_v2), uint64(func() int32 {
@@ -67217,10 +67237,14 @@ func _sqlite3VdbeSorterWrite(tls *crt.TLS, _pCsr *XVdbeCursor, _pVal *XMem) (r0
} }
}() }()
_pSorter = (*XVdbeSorter)(*(*unsafe.Pointer)(unsafe.Pointer((*t46)(unsafe.Pointer(&(_pCsr.X14)))))) _pSorter = (*XVdbeSorter)(*(*unsafe.Pointer)(unsafe.Pointer((*t46)(unsafe.Pointer(&(_pCsr.X14))))))
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5)) + 1*uintptr(i32(1))))))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5)) + 1*uintptr(i32(1))))))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5))+1*uintptr(i32(1)))))), (*uint32)(unsafe.Pointer(&_t))) return func() int32 {
_t = int32(uint32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5)) + 1*uintptr(i32(1))))))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5))+1*uintptr(i32(1)))))), (*uint32)(unsafe.Pointer(&_t))))
}() }()
if ((_t > i32(0)) && (_t < i32(10))) && (_t != i32(7)) { if ((_t > i32(0)) && (_t < i32(10))) && (_t != i32(7)) {
{ {
@@ -67364,18 +67388,23 @@ func _sqlite3VdbeIdxRowid(tls *crt.TLS, _db *Xsqlite3, _pCur *XBtCursor, _rowid
if _rc != 0 { if _rc != 0 {
return _rc return _rc
} }
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer(_m.X5))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer(_m.X5))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(_m.X5)), &_szHdr) return func() int32 { _szHdr = uint32(*(*uint8)(unsafe.Pointer(_m.X5))); return i32(1) }()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(_m.X5)), &_szHdr))
}() }()
if (_szHdr < uint32(i32(3))) || (int32(_szHdr) > (_m.X4)) { if (_szHdr < uint32(i32(3))) || (int32(_szHdr) > (_m.X4)) {
goto _idx_rowid_corruption goto _idx_rowid_corruption
} }
func() { func() int32 {
if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5)) + 1*uintptr(_szHdr-uint32(i32(1)))))))) >= int32(u8(128)) { if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5)) + 1*uintptr(_szHdr-uint32(i32(1)))))))) < int32(u8(128)) {
_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5))+1*uintptr(_szHdr-uint32(i32(1))))))), &_typeRowid) return func() int32 {
_typeRowid = uint32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5)) + 1*uintptr(_szHdr-uint32(i32(1))))))))
return i32(1)
}()
} }
return int32(_sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5))+1*uintptr(_szHdr-uint32(i32(1))))))), &_typeRowid))
}() }()
if ((_typeRowid < uint32(i32(1))) || (_typeRowid > uint32(i32(9)))) || (_typeRowid == uint32(i32(7))) { if ((_typeRowid < uint32(i32(1))) || (_typeRowid > uint32(i32(9)))) || (_typeRowid == uint32(i32(7))) {
goto _idx_rowid_corruption goto _idx_rowid_corruption

287
z_linux_test.go Normal file
View File

@@ -0,0 +1,287 @@
// Copyright 2017 The Sqlite Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package sqlite
import (
"bytes"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"strconv"
"testing"
)
func TestMP(t *testing.T) {
dir, err := ioutil.TempDir("", "sqlite-test-")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}()
wd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.Chdir(wd); err != nil {
t.Fatal(err)
}
}()
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
if out, err := exec.Command("go", "build", "-o", "mptest", "github.com/cznic/sqlite/internal/mptest").CombinedOutput(); err != nil {
t.Fatalf("go build mptest: %s\n%s", err, out)
}
pat := filepath.Join(wd, filepath.FromSlash("testdata/mptest"), "*.test")
m, err := filepath.Glob(pat)
if err != nil {
t.Fatal(err)
}
if len(m) == 0 {
t.Fatalf("%s: no files", pat)
}
nm := filepath.FromSlash("./mptest")
for _, v := range m {
os.Remove("db")
out, err := exec.Command(nm, "db", v).CombinedOutput()
t.Logf("%s", out)
if err != nil {
t.Fatal(err)
}
}
}
func TestThread1(t *testing.T) {
dir, err := ioutil.TempDir("", "sqlite-test-")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}()
wd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.Chdir(wd); err != nil {
t.Fatal(err)
}
}()
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
if out, err := exec.Command("go", "build", "-o", "threadtest1", "github.com/cznic/sqlite/internal/threadtest1").CombinedOutput(); err != nil {
t.Fatalf("go build mptest: %s\n%s", err, out)
}
for i := 0; i <= 20; i++ {
out, err := exec.Command("./threadtest1", strconv.Itoa(i), "-v").CombinedOutput()
t.Logf("%v:\n%s", i, out)
if err != nil {
t.Fatal(err)
}
}
}
func TestThread2(t *testing.T) {
t.Log("TODO")
return //TODO-
//TODO sqlite3.c:143403: createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0); -> fatal error: bad pointer in write barrier
dir, err := ioutil.TempDir("", "sqlite-test-")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}()
wd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.Chdir(wd); err != nil {
t.Fatal(err)
}
}()
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
if out, err := exec.Command("go", "build", "-o", "threadtest2", "github.com/cznic/sqlite/internal/threadtest2").CombinedOutput(); err != nil {
t.Fatalf("go build mptest: %s\n%s", err, out)
}
out, err := exec.Command("./threadtest2").CombinedOutput()
t.Logf("%s", out)
if err != nil {
t.Fatal(err)
}
}
func TestThread3(t *testing.T) {
t.Log("TODO")
return //TODO-
//TODO sqlite3.c:142510: sqlite3_wal_hook(db, sqlite3WalDefaultHook, SQLITE_INT_TO_PTR(nFrame)); -> fatal error: bad pointer in write barrier
dir, err := ioutil.TempDir("", "sqlite-test-")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}()
wd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.Chdir(wd); err != nil {
t.Fatal(err)
}
}()
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
s := []string{"build", "-o", "threadtest3"}
if *memTrace {
s = append(s, "-tags", "memory.trace", "-race")
}
if out, err := exec.Command("go", append(s, "github.com/cznic/sqlite/internal/threadtest3")...).CombinedOutput(); err != nil {
t.Fatalf("go build mptest: %s\n%s", err, out)
}
for _, opts := range [][]string{
{"walthread1"},
{"walthread2"},
{"walthread3"},
{"walthread4"},
{"walthread5"},
{"cgt_pager_1"},
{"dynamic_triggers"},
{"checkpoint_starvation_1"},
{"checkpoint_starvation_2"},
{"create_drop_index_1"},
{"lookaside1"},
{"vacuum1"},
{"stress1"},
{"stress2"},
} {
out, err := exec.Command("./threadtest3", opts...).CombinedOutput()
dbg("%v\n%s", opts, out)
t.Logf("%v\n%s", opts, out)
if err != nil {
t.Fatal(err)
}
if bytes.Contains(out, []byte("fault address")) ||
bytes.Contains(out, []byte("data race")) ||
bytes.Contains(out, []byte("RACE")) {
t.Fatal("fault")
}
}
}
func TestThread4(t *testing.T) {
t.Log("TODO")
return //TODO-
//TODO sqlite3.c:143403: createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0); -> fatal error: bad pointer in write barrier
cases := 0
dir, err := ioutil.TempDir("", "sqlite-test-")
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}()
wd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
defer func() {
if err := os.Chdir(wd); err != nil {
t.Fatal(err)
}
}()
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
s := []string{"build", "-o", "threadtest4"}
if *memTrace {
s = append(s, "-tags", "memory.trace", "-race")
}
if out, err := exec.Command("go", append(s, "github.com/cznic/sqlite/internal/threadtest4")...).CombinedOutput(); err != nil {
t.Fatalf("go build mptest: %s\n%s", err, out)
}
for _, opts := range [][]string{
{},
{"-wal"},
{"-serialized"},
{"-serialized", "-wal"},
{"--multithread"},
{"--multithread", "-wal"},
{"--multithread", "-serialized"},
{"--multithread", "-serialized", "-wal"},
} {
for i := 2; i <= 20; i++ {
out, err := exec.Command("./threadtest4", append(opts, strconv.Itoa(i))...).CombinedOutput()
t.Logf("%v: %v\n%s", i, opts, out)
if err != nil {
t.Fatal(err)
}
if bytes.Contains(out, []byte("fault address")) ||
bytes.Contains(out, []byte("data race")) ||
bytes.Contains(out, []byte("RACE")) {
t.Fatalf("case %v: fault", cases)
}
cases++
}
}
t.Logf("cases: %v", cases)
}