aboutsummaryrefslogtreecommitdiff
path: root/tests/functional/limit.go
diff options
context:
space:
mode:
Diffstat (limited to 'tests/functional/limit.go')
-rw-r--r--tests/functional/limit.go102
1 files changed, 102 insertions, 0 deletions
diff --git a/tests/functional/limit.go b/tests/functional/limit.go
new file mode 100644
index 0000000..8c65a25
--- /dev/null
+++ b/tests/functional/limit.go
@@ -0,0 +1,102 @@
+package main
+
+import (
+ "database/sql"
+ "fmt"
+ "log"
+ "os"
+ "strings"
+
+ "golite"
+)
+
+func createBulkInsertQuery(n int, start int) (string, []any) {
+ values := make([]string, n)
+ args := make([]any, n*2)
+ pos := 0
+ for i := 0; i < n; i++ {
+ values[i] = "(?, ?)"
+ args[pos] = start + i
+ args[pos+1] = fmt.Sprintf("こんにちは世界%03d", i)
+ pos += 2
+ }
+ query := fmt.Sprintf(
+ "insert into mylimittable(id, name) values %s",
+ strings.Join(values, ", "),
+ )
+ return query, args
+}
+
+func bulkInsert(db *sql.DB, query string, args []any) error {
+ stmt, err := db.Prepare(query)
+ if err != nil {
+ return err
+ }
+
+ _, err = stmt.Exec(args...)
+ return err
+}
+
+func main() {
+ const (
+ num = 400
+ smallLimit = 100
+ bigLimit = 999999
+ )
+
+ const SQL = `
+ create table mylimittable (id integer not null primary key, name text);
+ delete from mylimittable;
+ `
+
+ var conn *golite.SQLiteConn
+ sql.Register("sqlite3_with_limit", &golite.SQLiteDriver{
+ ConnectHook: func(c *golite.SQLiteConn) error {
+ conn = c
+ return nil
+ },
+ })
+
+ os.Remove("limit.db")
+ defer os.Remove("limit.db")
+ db, err := sql.Open("sqlite3_with_limit", "limit.db")
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer db.Close()
+
+ _, err = db.Exec(SQL)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ if conn == nil {
+ log.Fatal("not set sqlite3 connection")
+ }
+
+ {
+ query, args := createBulkInsertQuery(num, 0)
+ err := bulkInsert(db, query, args)
+ if err != nil {
+ log.Fatal(err)
+ }
+ }
+
+ conn.SetLimit(golite.SQLITE_LIMIT_VARIABLE_NUMBER, smallLimit)
+ {
+ query, args := createBulkInsertQuery(num, num)
+ err := bulkInsert(db, query, args)
+ if err == nil {
+ log.Fatal("expected failure didn't happen")
+ }
+ }
+
+ conn.SetLimit(golite.SQLITE_LIMIT_VARIABLE_NUMBER, bigLimit)
+ {
+ query, args := createBulkInsertQuery(500, num+num)
+ err := bulkInsert(db, query, args)
+ if err != nil {
+ log.Fatal(err)
+ }
+ }
+}