aboutsummaryrefslogtreecommitdiff
path: root/all_test.go
diff options
context:
space:
mode:
authorJan Mercl <0xjnml@gmail.com>2017-06-05 20:13:10 +0200
committerJan Mercl <0xjnml@gmail.com>2017-06-05 20:13:10 +0200
commit8c183b526ba8f225684f6431836138a9cffae509 (patch)
tree4afc11a44fe89e0e7081f00085eed90357218fac /all_test.go
parent1a3b0a731a9d2b66fb058caef95c004634b17307 (diff)
Release the {cgo,VM}-free Linux/Intel version.
modified: Makefile new file: all_linux_test.go renamed: all_test.go -> all_test_windows.go new file: doc.go new file: generate_linux.go new file: generate_windows.go modified: generator.go new file: generator_windows.go modified: internal/bin/bin_linux_386.go modified: internal/bin/bin_linux_amd64.go modified: main.c modified: sqlite.go modified: sqlite_go18.go new file: sqlite_windows.go
Diffstat (limited to 'all_test.go')
-rw-r--r--all_test.go494
1 files changed, 0 insertions, 494 deletions
diff --git a/all_test.go b/all_test.go
deleted file mode 100644
index 34f5349..0000000
--- a/all_test.go
+++ /dev/null
@@ -1,494 +0,0 @@
-// 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"
- "database/sql"
- "flag"
- "fmt"
- "io"
- "io/ioutil"
- "os"
- "path"
- "path/filepath"
- "runtime"
- "sort"
- "strings"
- "testing"
- "time"
-
- "github.com/cznic/virtual"
-)
-
-func caller(s string, va ...interface{}) {
- if s == "" {
- s = strings.Repeat("%v ", len(va))
- }
- _, fn, fl, _ := runtime.Caller(2)
- fmt.Fprintf(os.Stderr, "# caller: %s:%d: ", path.Base(fn), fl)
- fmt.Fprintf(os.Stderr, s, va...)
- fmt.Fprintln(os.Stderr)
- _, fn, fl, _ = runtime.Caller(1)
- fmt.Fprintf(os.Stderr, "# \tcallee: %s:%d: ", path.Base(fn), fl)
- fmt.Fprintln(os.Stderr)
- os.Stderr.Sync()
-}
-
-func dbg(s string, va ...interface{}) {
- if s == "" {
- s = strings.Repeat("%v ", len(va))
- }
- _, fn, fl, _ := runtime.Caller(1)
- fmt.Fprintf(os.Stderr, "# dbg %s:%d: ", path.Base(fn), fl)
- fmt.Fprintf(os.Stderr, s, va...)
- fmt.Fprintln(os.Stderr)
- os.Stderr.Sync()
-}
-
-func TODO(...interface{}) string { //TODOOK
- _, fn, fl, _ := runtime.Caller(1)
- return fmt.Sprintf("# TODO: %s:%d:\n", path.Base(fn), fl) //TODOOK
-}
-
-func use(...interface{}) {}
-
-func init() {
- use(caller, dbg, TODO) //TODOOK
-}
-
-// ============================================================================
-
-var (
- // Add "-tags virtual.profile" to the command.
- profileAll = flag.Bool("profile", false, "")
- profileFunctions = flag.Bool("profile_functions", false, "")
- profileInstructions = flag.Bool("profile_instructions", false, "")
- profileLines = flag.Bool("profile_lines", false, "")
- profileRate = flag.Int("profile_rate", 1000, "")
- recsPerSec = flag.Bool("recs_per_sec_as_mbps", false, "Show records per second as MB/s.")
-)
-
-func tempDB(t testing.TB) (string, *sql.DB) {
- dir, err := ioutil.TempDir("", "sqlite-test-")
- if err != nil {
- t.Fatal(err)
- }
-
- db, err := sql.Open(driverName, filepath.Join(dir, "tmp.db"))
- if err != nil {
- os.RemoveAll(dir)
- t.Fatal(err)
- }
-
- return dir, db
-}
-
-func TestScalar(t *testing.T) {
- dir, db := tempDB(t)
-
- defer func() {
- db.Close()
- os.RemoveAll(dir)
- }()
-
- t1 := time.Date(2017, 4, 20, 1, 2, 3, 56789, time.UTC)
- t2 := time.Date(2018, 5, 21, 2, 3, 4, 98765, time.UTC)
- r, err := db.Exec(`
- create table t(i int, f double, b bool, s text, t time);
- insert into t values(12, 3.14, ?, "foo", ?), (34, 2.78, ?, "bar", ?);
- `,
- true, t1,
- false, t2,
- )
- if err != nil {
- t.Fatal(err)
- }
-
- n, err := r.RowsAffected()
- if err != nil {
- t.Fatal(err)
- }
-
- if g, e := n, int64(2); g != e {
- t.Fatal(g, e)
- }
-
- rows, err := db.Query("select * from t")
- if err != nil {
- t.Fatal(err)
- }
-
- type rec struct {
- i int
- f float64
- b bool
- s string
- t string
- }
- var a []rec
- for rows.Next() {
- var r rec
- if err := rows.Scan(&r.i, &r.f, &r.b, &r.s, &r.t); err != nil {
- t.Fatal(err)
- }
-
- a = append(a, r)
- }
- if err := rows.Err(); err != nil {
- t.Fatal(err)
- }
-
- if g, e := len(a), 2; g != e {
- t.Fatal(g, e)
- }
-
- if g, e := a[0], (rec{12, 3.14, true, "foo", t1.String()}); g != e {
- t.Fatal(g, e)
- }
-
- if g, e := a[1], (rec{34, 2.78, false, "bar", t2.String()}); g != e {
- t.Fatal(g, e)
- }
-}
-
-func TestBlob(t *testing.T) {
- dir, db := tempDB(t)
-
- defer func() {
- db.Close()
- os.RemoveAll(dir)
- }()
-
- b1 := []byte(time.Now().String())
- b2 := []byte("\x00foo\x00bar\x00")
- if _, err := db.Exec(`
- create table t(b blob);
- insert into t values(?), (?);
- `, b1, b2,
- ); err != nil {
- t.Fatal(err)
- }
-
- rows, err := db.Query("select * from t")
- if err != nil {
- t.Fatal(err)
- }
-
- type rec struct {
- b []byte
- }
- var a []rec
- for rows.Next() {
- var r rec
- if err := rows.Scan(&r.b); err != nil {
- t.Fatal(err)
- }
-
- a = append(a, r)
- }
- if err := rows.Err(); err != nil {
- t.Fatal(err)
- }
-
- if g, e := len(a), 2; g != e {
- t.Fatal(g, e)
- }
-
- if g, e := a[0].b, b1; !bytes.Equal(g, e) {
- t.Fatal(g, e)
- }
-
- if g, e := a[1].b, b2; !bytes.Equal(g, e) {
- t.Fatal(g, e)
- }
-}
-
-func profile(t testing.TB, d time.Duration, w io.Writer, format string, arg ...interface{}) {
- rate := vm.ProfileRate
- if rate == 0 {
- rate = 1
- }
- if len(vm.ProfileFunctions)+len(vm.ProfileLines)+len(vm.ProfileInstructions) != 0 {
- fmt.Fprintf(w, "# %v\n", os.Args[1:])
- }
- if len(vm.ProfileFunctions) != 0 {
- fmt.Fprintf(w, format, arg...)
- type u struct {
- virtual.PCInfo
- n int
- }
- var s int64
- var a []u
- var wi int
- for k, v := range vm.ProfileFunctions {
- a = append(a, u{k, v})
- s += int64(v)
- if n := len(k.Name.String()); n > wi {
- wi = n
- }
- }
- sort.Slice(a, func(i, j int) bool {
- if a[i].n < a[j].n {
- return true
- }
-
- if a[i].n > a[j].n {
- return false
- }
-
- return a[i].Name < a[j].Name
- })
- fmt.Fprintf(w, "---- Profile functions, %v samples in %v, %.3f MIPS, %v/sample\n", s, d, float64(s)/1e6*float64(rate)*float64(time.Second)/float64(d), time.Duration(float64(d)/float64(s)))
- if x, ok := t.(*testing.B); ok {
- fmt.Fprintf(w, "\t%v samples/1 [samples/b.N]\n", s/int64(x.N))
- }
- var c int64
- for i := len(a) - 1; i >= 0; i-- {
- c += int64(a[i].n)
- fmt.Fprintf(
- w,
- "%*v\t%10v%10.2f%%%10.2f%%\n",
- -wi, a[i].Name, a[i].n,
- 100*float64(a[i].n)/float64(s),
- 100*float64(c)/float64(s),
- )
- }
- }
- if len(vm.ProfileLines) != 0 {
- fmt.Fprintf(w, format, arg...)
- type u struct {
- virtual.PCInfo
- n int
- }
- var s int64
- var a []u
- for k, v := range vm.ProfileLines {
- a = append(a, u{k, v})
- s += int64(v)
- }
- sort.Slice(a, func(i, j int) bool {
- if a[i].n < a[j].n {
- return true
- }
-
- if a[i].n > a[j].n {
- return false
- }
-
- if a[i].Name < a[j].Name {
- return true
- }
-
- if a[i].Name > a[j].Name {
- return false
- }
-
- return a[i].Line < a[j].Line
- })
- fmt.Fprintf(w, "---- Profile lines, %v samples in %v, %.3f MIPS, %v/sample\n", s, d, float64(s)/1e6*float64(rate)*float64(time.Second)/float64(d), time.Duration(float64(d)/float64(s)))
- if x, ok := t.(*testing.B); ok {
- fmt.Fprintf(w, "\t%v samples/1 [samples/b.N]\n", s/int64(x.N))
- }
- var c int64
- for i := len(a) - 1; i >= 0; i-- {
- c += int64(a[i].n)
- fmt.Fprintf(
- w,
- "%v:%v:\t%10v%10.2f%%%10.2f%%\n",
- a[i].Name, a[i].Line, a[i].n,
- 100*float64(a[i].n)/float64(s),
- 100*float64(c)/float64(s),
- )
- }
- }
- if len(vm.ProfileInstructions) != 0 {
- fmt.Fprintf(w, format, arg...)
- type u struct {
- virtual.Opcode
- n int
- }
- var s int64
- var a []u
- var wi int
- for k, v := range vm.ProfileInstructions {
- a = append(a, u{k, v})
- s += int64(v)
- if n := len(k.String()); n > wi {
- wi = n
- }
- }
- sort.Slice(a, func(i, j int) bool {
- if a[i].n < a[j].n {
- return true
- }
-
- if a[i].n > a[j].n {
- return false
- }
-
- return a[i].Opcode < a[j].Opcode
- })
- fmt.Fprintf(w, "---- Profile instructions, %v samples in %v, %.3f MIPS, %v/sample\n", s, d, float64(s)/1e6*float64(rate)*float64(time.Second)/float64(d), time.Duration(float64(d)/float64(s)))
- if x, ok := t.(*testing.B); ok {
- fmt.Fprintf(w, "\t%v samples/1 [samples/b.N]\n", s/int64(x.N))
- }
- var c int64
- for i := len(a) - 1; i >= 0; i-- {
- c += int64(a[i].n)
- fmt.Fprintf(
- w,
- "%*s%10v%10.2f%%\t%10.2f%%\n",
- -wi, a[i].Opcode, a[i].n,
- 100*float64(a[i].n)/float64(s),
- 100*float64(c)/float64(s),
- )
- }
- }
-}
-
-func BenchmarkInsertMemory(b *testing.B) {
- db, err := sql.Open(driverName, "file::memory:")
- if err != nil {
- b.Fatal(err)
- }
-
- defer func() {
- db.Close()
- }()
-
- if _, err := db.Exec(`
- create table t(i int);
- begin;
- `); err != nil {
- b.Fatal(err)
- }
-
- s, err := db.Prepare("insert into t values(?)")
- if err != nil {
- b.Fatal(err)
- }
-
- if *profileAll || *profileFunctions {
- vm.ProfileFunctions = map[virtual.PCInfo]int{}
- }
- if *profileAll || *profileLines {
- vm.ProfileLines = map[virtual.PCInfo]int{}
- }
- if *profileAll || *profileInstructions {
- vm.ProfileInstructions = map[virtual.Opcode]int{}
- }
- vm.ProfileRate = int(*profileRate)
- t0 := time.Now()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- if _, err := s.Exec(int64(i)); err != nil {
- b.Fatal(err)
- }
- }
- b.StopTimer()
- if *recsPerSec {
- b.SetBytes(1e6)
- }
- d := time.Since(t0)
- if _, err := db.Exec(`commit;`); err != nil {
- b.Fatal(err)
- }
-
- profile(b, d, os.Stderr, "==== BenchmarkInsertMemory b.N %v\n", b.N)
-}
-
-func BenchmarkNextMemory(b *testing.B) {
- db, err := sql.Open(driverName, "file::memory:")
- if err != nil {
- b.Fatal(err)
- }
-
- defer func() {
- db.Close()
- }()
-
- if _, err := db.Exec(`
- create table t(i int);
- begin;
- `); err != nil {
- b.Fatal(err)
- }
-
- s, err := db.Prepare("insert into t values(?)")
- if err != nil {
- b.Fatal(err)
- }
-
- defer s.Close()
-
- for i := 0; i < b.N; i++ {
- if _, err := s.Exec(int64(i)); err != nil {
- b.Fatal(err)
- }
- }
- if _, err := db.Exec("commit"); err != nil {
- b.Fatal(err)
- }
-
- r, err := db.Query("select * from t")
- if err != nil {
-
- }
-
- defer r.Close()
-
- if *profileAll || *profileFunctions {
- vm.ProfileFunctions = map[virtual.PCInfo]int{}
- }
- if *profileAll || *profileLines {
- vm.ProfileLines = map[virtual.PCInfo]int{}
- }
- if *profileAll || *profileInstructions {
- vm.ProfileInstructions = map[virtual.Opcode]int{}
- }
- vm.ProfileRate = int(*profileRate)
- t0 := time.Now()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- if !r.Next() {
- b.Fatal(err)
- }
- }
- b.StopTimer()
- if *recsPerSec {
- b.SetBytes(1e6)
- }
- d := time.Since(t0)
- profile(b, d, os.Stderr, "==== BenchmarkNextMemory b.N %v\n", b.N)
-}
-
-// https://github.com/cznic/sqlite/issues/11
-func TestIssue11(t *testing.T) {
- const N = 6570
- dir, db := tempDB(t)
-
- defer func() {
- db.Close()
- os.RemoveAll(dir)
- }()
-
- if _, err := db.Exec(`
- CREATE TABLE t1 (t INT);
- BEGIN;
-`,
- ); err != nil {
- panic(err)
- }
-
- for i := 0; i < N; i++ {
- if _, err := db.Exec("INSERT INTO t1 (t) VALUES (?)", i); err != nil {
- t.Fatalf("#%v: %v", i, err)
- }
- }
- if _, err := db.Exec("COMMIT;"); err != nil {
- t.Fatal(err)
- }
-}