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) } } }