diff options
author | Jan Mercl <0xjnml@gmail.com> | 2017-07-04 17:14:51 +0200 |
---|---|---|
committer | Jan Mercl <0xjnml@gmail.com> | 2017-07-04 17:14:51 +0200 |
commit | 91382a842554c2225f993a39851dedba34f14cb8 (patch) | |
tree | cd21cfb93897a73e90385d260e6cc64149e5e139 | |
parent | 2aa5e95243d7c8dca1acf8439d8a9da0225242cb (diff) |
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
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | all_test.go | 266 | ||||
-rw-r--r-- | internal/bin/bin_linux_386.go | 77 | ||||
-rw-r--r-- | internal/bin/bin_linux_amd64.go | 77 | ||||
-rw-r--r-- | z_linux_test.go | 287 |
5 files changed, 394 insertions, 315 deletions
@@ -20,7 +20,7 @@ all: editor 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: t=$(shell tempfile) ; go test -coverprofile $$t && go tool cover -html $$t && unlink $$t diff --git a/all_test.go b/all_test.go index 697e066..946b939 100644 --- a/all_test.go +++ b/all_test.go @@ -11,11 +11,9 @@ import ( "fmt" "io/ioutil" "os" - "os/exec" "path" "path/filepath" "runtime" - "strconv" "strings" "testing" "time" @@ -351,267 +349,3 @@ func TestMemDB(t *testing.T) { 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) -} diff --git a/internal/bin/bin_linux_386.go b/internal/bin/bin_linux_386.go index 8023f4d..e245d4a 100644 --- a/internal/bin/bin_linux_386.go +++ b/internal/bin/bin_linux_386.go @@ -56973,10 +56973,14 @@ _29: if (int32(_pRhs.X1) & i32(2)) == 0 { goto _40 } - func() { - 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) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) < int32(u8(128)) { + 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)) { _rc = i32(-1) @@ -57022,10 +57026,14 @@ _40: crt.X__builtin_abort(tls) } }() - func() { - 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) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) < int32(u8(128)) { + 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) { _rc = i32(-1) @@ -57402,10 +57410,14 @@ func _vdbeRecordCompareString(tls *crt.TLS, _nKey1 int32, _pKey1 unsafe.Pointer, } }() _vdbeAssertFieldCountWithinLimits(tls, _nKey1, _pKey1, (*XKeyInfo)(_pPKey2.X0)) - func() { - 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))) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(i32(1))))) < int32(u8(128)) { + 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) { _res = int32(_pPKey2.X5) @@ -65291,16 +65303,24 @@ func _vdbeSorterCompareText(tls *crt.TLS, _pTask *XSortSubtask, _pbKey2Cached *i _p2 = (*uint8)(_pKey2) _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))))))) - func() { - 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))) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(1))))) < int32(u8(128)) { + 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) - func() { - 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))) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(1))))) < int32(u8(128)) { + 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) _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)))))) - func() { - 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))) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5)) + 1*uintptr(i32(1))))))) < int32(u8(128)) { + 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)) { { @@ -67355,18 +67379,23 @@ func _sqlite3VdbeIdxRowid(tls *crt.TLS, _db *Xsqlite3, _pCur *XBtCursor, _rowid if _rc != 0 { return _rc } - func() { - if int32(*(*uint8)(unsafe.Pointer(_m.X5))) >= int32(u8(128)) { - _sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(_m.X5)), &_szHdr) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(_m.X5))) < int32(u8(128)) { + 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)) { goto _idx_rowid_corruption } - func() { - 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) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5)) + 1*uintptr(_szHdr-uint32(i32(1)))))))) < int32(u8(128)) { + 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))) { goto _idx_rowid_corruption diff --git a/internal/bin/bin_linux_amd64.go b/internal/bin/bin_linux_amd64.go index e341090..677302d 100644 --- a/internal/bin/bin_linux_amd64.go +++ b/internal/bin/bin_linux_amd64.go @@ -56982,10 +56982,14 @@ _29: if (int32(_pRhs.X1) & i32(2)) == 0 { goto _40 } - func() { - 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) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) < int32(u8(128)) { + 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)) { _rc = i32(-1) @@ -57031,10 +57035,14 @@ _40: crt.X__builtin_abort(tls) } }() - func() { - 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) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(_idx1)))) < int32(u8(128)) { + 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) { _rc = i32(-1) @@ -57411,10 +57419,14 @@ func _vdbeRecordCompareString(tls *crt.TLS, _nKey1 int32, _pKey1 unsafe.Pointer, } }() _vdbeAssertFieldCountWithinLimits(tls, _nKey1, _pKey1, (*XKeyInfo)(_pPKey2.X0)) - func() { - 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))) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_aKey1)) + 1*uintptr(i32(1))))) < int32(u8(128)) { + 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) { _res = int32(_pPKey2.X5) @@ -65300,16 +65312,24 @@ func _vdbeSorterCompareText(tls *crt.TLS, _pTask *XSortSubtask, _pbKey2Cached *i _p2 = (*uint8)(_pKey2) _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))))))) - func() { - 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))) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p1)) + 1*uintptr(i32(1))))) < int32(u8(128)) { + 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) - func() { - 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))) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_p2)) + 1*uintptr(i32(1))))) < int32(u8(128)) { + 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) _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)))))) - func() { - 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))) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_pVal.X5)) + 1*uintptr(i32(1))))))) < int32(u8(128)) { + 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)) { { @@ -67364,18 +67388,23 @@ func _sqlite3VdbeIdxRowid(tls *crt.TLS, _db *Xsqlite3, _pCur *XBtCursor, _rowid if _rc != 0 { return _rc } - func() { - if int32(*(*uint8)(unsafe.Pointer(_m.X5))) >= int32(u8(128)) { - _sqlite3GetVarint32(tls, (*uint8)(unsafe.Pointer(_m.X5)), &_szHdr) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer(_m.X5))) < int32(u8(128)) { + 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)) { goto _idx_rowid_corruption } - func() { - 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) + func() int32 { + if int32(*(*uint8)(unsafe.Pointer((*int8)(unsafe.Pointer(uintptr((unsafe.Pointer)(_m.X5)) + 1*uintptr(_szHdr-uint32(i32(1)))))))) < int32(u8(128)) { + 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))) { goto _idx_rowid_corruption diff --git a/z_linux_test.go b/z_linux_test.go new file mode 100644 index 0000000..9089fd8 --- /dev/null +++ b/z_linux_test.go @@ -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) +} |