From 64bb93539113de32d6ae3daef1e09ca8239c743d Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Wed, 16 Sep 2015 10:47:42 +0900 Subject: remove binary file --- _example/custom_func/main.go | 133 +++++++++++++++++++++++++++++++ _example/go_custom_funcs/go_custom_funcs | Bin 6601208 -> 0 bytes _example/go_custom_funcs/main.go | 133 ------------------------------- 3 files changed, 133 insertions(+), 133 deletions(-) create mode 100644 _example/custom_func/main.go delete mode 100755 _example/go_custom_funcs/go_custom_funcs delete mode 100644 _example/go_custom_funcs/main.go (limited to '_example') diff --git a/_example/custom_func/main.go b/_example/custom_func/main.go new file mode 100644 index 0000000..85657e6 --- /dev/null +++ b/_example/custom_func/main.go @@ -0,0 +1,133 @@ +package main + +import ( + "database/sql" + "fmt" + "log" + "math" + "math/rand" + + sqlite "github.com/mattn/go-sqlite3" +) + +// Computes x^y +func pow(x, y int64) int64 { + return int64(math.Pow(float64(x), float64(y))) +} + +// Computes the bitwise exclusive-or of all its arguments +func xor(xs ...int64) int64 { + var ret int64 + for _, x := range xs { + ret ^= x + } + return ret +} + +// Returns a random number. It's actually deterministic here because +// we don't seed the RNG, but it's an example of a non-pure function +// from SQLite's POV. +func getrand() int64 { + return rand.Int63() +} + +// Computes the standard deviation of a GROUPed BY set of values +type stddev struct { + xs []int64 + // Running average calculation + sum int64 + n int64 +} + +func newStddev() *stddev { return &stddev{} } + +func (s *stddev) Step(x int64) { + s.xs = append(s.xs, x) + s.sum += x + s.n++ +} + +func (s *stddev) Done() float64 { + mean := float64(s.sum) / float64(s.n) + var sqDiff []float64 + for _, x := range s.xs { + sqDiff = append(sqDiff, math.Pow(float64(x)-mean, 2)) + } + var dev float64 + for _, x := range sqDiff { + dev += x + } + dev /= float64(len(sqDiff)) + return math.Sqrt(dev) +} + +func main() { + sql.Register("sqlite3_custom", &sqlite.SQLiteDriver{ + ConnectHook: func(conn *sqlite.SQLiteConn) error { + if err := conn.RegisterFunc("pow", pow, true); err != nil { + return err + } + if err := conn.RegisterFunc("xor", xor, true); err != nil { + return err + } + if err := conn.RegisterFunc("rand", getrand, false); err != nil { + return err + } + if err := conn.RegisterAggregator("stddev", newStddev, true); err != nil { + return err + } + return nil + }, + }) + + db, err := sql.Open("sqlite3_custom", ":memory:") + if err != nil { + log.Fatal("Failed to open database:", err) + } + defer db.Close() + + var i int64 + err = db.QueryRow("SELECT pow(2,3)").Scan(&i) + if err != nil { + log.Fatal("POW query error:", err) + } + fmt.Println("pow(2,3) =", i) // 8 + + err = db.QueryRow("SELECT xor(1,2,3,4,5,6)").Scan(&i) + if err != nil { + log.Fatal("XOR query error:", err) + } + fmt.Println("xor(1,2,3,4,5) =", i) // 7 + + err = db.QueryRow("SELECT rand()").Scan(&i) + if err != nil { + log.Fatal("RAND query error:", err) + } + fmt.Println("rand() =", i) // pseudorandom + + _, err = db.Exec("create table foo (department integer, profits integer)") + if err != nil { + log.Fatal("Failed to create table:", err) + } + _, err = db.Exec("insert into foo values (1, 10), (1, 20), (1, 45), (2, 42), (2, 115)") + if err != nil { + log.Fatal("Failed to insert records:", err) + } + + rows, err := db.Query("select department, stddev(profits) from foo group by department") + if err != nil { + log.Fatal("STDDEV query error:", err) + } + defer rows.Close() + for rows.Next() { + var dept int64 + var dev float64 + if err := rows.Scan(&dept, &dev); err != nil { + log.Fatal(err) + } + fmt.Printf("dept=%d stddev=%f\n", dept, dev) + } + if err := rows.Err(); err != nil { + log.Fatal(err) + } +} diff --git a/_example/go_custom_funcs/go_custom_funcs b/_example/go_custom_funcs/go_custom_funcs deleted file mode 100755 index b6be764..0000000 Binary files a/_example/go_custom_funcs/go_custom_funcs and /dev/null differ diff --git a/_example/go_custom_funcs/main.go b/_example/go_custom_funcs/main.go deleted file mode 100644 index 85657e6..0000000 --- a/_example/go_custom_funcs/main.go +++ /dev/null @@ -1,133 +0,0 @@ -package main - -import ( - "database/sql" - "fmt" - "log" - "math" - "math/rand" - - sqlite "github.com/mattn/go-sqlite3" -) - -// Computes x^y -func pow(x, y int64) int64 { - return int64(math.Pow(float64(x), float64(y))) -} - -// Computes the bitwise exclusive-or of all its arguments -func xor(xs ...int64) int64 { - var ret int64 - for _, x := range xs { - ret ^= x - } - return ret -} - -// Returns a random number. It's actually deterministic here because -// we don't seed the RNG, but it's an example of a non-pure function -// from SQLite's POV. -func getrand() int64 { - return rand.Int63() -} - -// Computes the standard deviation of a GROUPed BY set of values -type stddev struct { - xs []int64 - // Running average calculation - sum int64 - n int64 -} - -func newStddev() *stddev { return &stddev{} } - -func (s *stddev) Step(x int64) { - s.xs = append(s.xs, x) - s.sum += x - s.n++ -} - -func (s *stddev) Done() float64 { - mean := float64(s.sum) / float64(s.n) - var sqDiff []float64 - for _, x := range s.xs { - sqDiff = append(sqDiff, math.Pow(float64(x)-mean, 2)) - } - var dev float64 - for _, x := range sqDiff { - dev += x - } - dev /= float64(len(sqDiff)) - return math.Sqrt(dev) -} - -func main() { - sql.Register("sqlite3_custom", &sqlite.SQLiteDriver{ - ConnectHook: func(conn *sqlite.SQLiteConn) error { - if err := conn.RegisterFunc("pow", pow, true); err != nil { - return err - } - if err := conn.RegisterFunc("xor", xor, true); err != nil { - return err - } - if err := conn.RegisterFunc("rand", getrand, false); err != nil { - return err - } - if err := conn.RegisterAggregator("stddev", newStddev, true); err != nil { - return err - } - return nil - }, - }) - - db, err := sql.Open("sqlite3_custom", ":memory:") - if err != nil { - log.Fatal("Failed to open database:", err) - } - defer db.Close() - - var i int64 - err = db.QueryRow("SELECT pow(2,3)").Scan(&i) - if err != nil { - log.Fatal("POW query error:", err) - } - fmt.Println("pow(2,3) =", i) // 8 - - err = db.QueryRow("SELECT xor(1,2,3,4,5,6)").Scan(&i) - if err != nil { - log.Fatal("XOR query error:", err) - } - fmt.Println("xor(1,2,3,4,5) =", i) // 7 - - err = db.QueryRow("SELECT rand()").Scan(&i) - if err != nil { - log.Fatal("RAND query error:", err) - } - fmt.Println("rand() =", i) // pseudorandom - - _, err = db.Exec("create table foo (department integer, profits integer)") - if err != nil { - log.Fatal("Failed to create table:", err) - } - _, err = db.Exec("insert into foo values (1, 10), (1, 20), (1, 45), (2, 42), (2, 115)") - if err != nil { - log.Fatal("Failed to insert records:", err) - } - - rows, err := db.Query("select department, stddev(profits) from foo group by department") - if err != nil { - log.Fatal("STDDEV query error:", err) - } - defer rows.Close() - for rows.Next() { - var dept int64 - var dev float64 - if err := rows.Scan(&dept, &dev); err != nil { - log.Fatal(err) - } - fmt.Printf("dept=%d stddev=%f\n", dept, dev) - } - if err := rows.Err(); err != nil { - log.Fatal(err) - } -} -- cgit v1.2.3