Files
sqlite3/ext/csv/csv_test.go

206 lines
3.7 KiB
Go
Raw Normal View History

2023-11-23 03:28:56 +00:00
package csv_test
import (
"fmt"
"log"
2023-11-23 09:54:18 +00:00
"testing"
2023-11-23 03:28:56 +00:00
"github.com/ncruces/go-sqlite3"
_ "github.com/ncruces/go-sqlite3/embed"
"github.com/ncruces/go-sqlite3/ext/csv"
2024-06-02 10:33:20 +01:00
_ "github.com/ncruces/go-sqlite3/internal/testcfg"
2023-11-23 03:28:56 +00:00
)
func Example() {
db, err := sqlite3.Open(":memory:")
if err != nil {
log.Fatal(err)
}
defer db.Close()
2023-11-23 09:54:18 +00:00
csv.Register(db)
2023-11-23 03:28:56 +00:00
err = db.Exec(`
2024-04-04 01:25:52 +01:00
CREATE VIRTUAL TABLE eurofxref USING csv(
2023-11-23 09:54:18 +00:00
filename = 'testdata/eurofxref.csv',
2023-11-23 03:28:56 +00:00
header = YES,
2023-11-23 09:54:18 +00:00
columns = 42,
2023-11-23 03:28:56 +00:00
)`)
if err != nil {
log.Fatal(err)
}
stmt, _, err := db.Prepare(`SELECT USD FROM eurofxref WHERE Date = '2022-02-22'`)
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
if stmt.Step() {
fmt.Printf("On Twosday, 1€ = $%g", stmt.ColumnFloat(0))
}
if err := stmt.Reset(); err != nil {
log.Fatal(err)
}
err = db.Exec(`DROP TABLE eurofxref`)
if err != nil {
log.Fatal(err)
}
// Output:
// On Twosday, 1€ = $1.1342
}
2023-11-23 09:54:18 +00:00
func TestRegister(t *testing.T) {
2023-12-02 12:03:31 +00:00
t.Parallel()
2023-11-23 09:54:18 +00:00
db, err := sqlite3.Open(":memory:")
if err != nil {
t.Fatal(err)
}
defer db.Close()
csv.Register(db)
2023-12-19 00:13:51 +00:00
const data = `
2023-11-23 09:54:18 +00:00
"Rob" "Pike" rob
"Ken" Thompson ken
Robert "Griesemer" "gri"`
err = db.Exec(`
CREATE VIRTUAL TABLE temp.users USING csv(
data = ` + sqlite3.Quote(data) + `,
schema = 'CREATE TABLE x(first_name, last_name, username)',
comma = '\t'
)`)
if err != nil {
t.Fatal(err)
}
stmt, _, err := db.Prepare(`SELECT * FROM temp.users WHERE rowid = 1 ORDER BY username`)
if err != nil {
t.Fatal(err)
}
defer stmt.Close()
if !stmt.Step() {
t.Fatal("no rows")
}
2023-12-19 00:13:51 +00:00
if got := stmt.ColumnText(0); got != "Rob" {
t.Errorf("got %q want Rob", got)
2023-11-23 09:54:18 +00:00
}
if stmt.Step() {
t.Fatal("more rows")
}
err = db.Exec(`ALTER TABLE temp.users RENAME TO csv`)
if err != nil {
t.Fatal(err)
}
err = db.Exec(`PRAGMA integrity_check`)
if err != nil {
2023-12-19 00:13:51 +00:00
t.Error(err)
}
err = db.Exec(`PRAGMA quick_check`)
if err != nil {
t.Error(err)
2023-11-23 09:54:18 +00:00
}
err = db.Exec(`DROP TABLE temp.csv`)
if err != nil {
2023-12-19 00:13:51 +00:00
t.Error(err)
2023-11-23 09:54:18 +00:00
}
}
func TestAffinity(t *testing.T) {
t.Parallel()
db, err := sqlite3.Open(":memory:")
if err != nil {
t.Fatal(err)
}
defer db.Close()
csv.Register(db)
const data = "01\n0.10\ne"
err = db.Exec(`
CREATE VIRTUAL TABLE temp.nums USING csv(
data = ` + sqlite3.Quote(data) + `,
schema = 'CREATE TABLE x(a numeric)'
)`)
if err != nil {
t.Fatal(err)
}
stmt, _, err := db.Prepare(`SELECT * FROM temp.nums`)
if err != nil {
t.Fatal(err)
}
defer stmt.Close()
if stmt.Step() {
if got := stmt.ColumnText(0); got != "1" {
t.Errorf("got %q want 1", got)
}
}
if stmt.Step() {
if got := stmt.ColumnText(0); got != "0.1" {
t.Errorf("got %q want 0.1", got)
}
}
if stmt.Step() {
if got := stmt.ColumnText(0); got != "e" {
t.Errorf("got %q want e", got)
}
}
}
2023-11-23 09:54:18 +00:00
func TestRegister_errors(t *testing.T) {
2023-12-02 12:03:31 +00:00
t.Parallel()
2023-11-23 09:54:18 +00:00
db, err := sqlite3.Open(":memory:")
if err != nil {
t.Fatal(err)
}
defer db.Close()
csv.Register(db)
err = db.Exec(`CREATE VIRTUAL TABLE temp.users USING csv()`)
if err == nil {
2023-11-23 15:32:28 +00:00
t.Fatal("want error")
2023-11-23 09:54:18 +00:00
} else {
t.Log(err)
}
err = db.Exec(`CREATE VIRTUAL TABLE temp.users USING csv(data='abc', data='abc')`)
if err == nil {
2023-11-23 15:32:28 +00:00
t.Fatal("want error")
2023-11-23 09:54:18 +00:00
} else {
t.Log(err)
}
err = db.Exec(`CREATE VIRTUAL TABLE temp.users USING csv(data='abc', xpto='abc')`)
if err == nil {
2023-11-23 15:32:28 +00:00
t.Fatal("want error")
2023-11-23 09:54:18 +00:00
} else {
t.Log(err)
}
err = db.Exec(`CREATE VIRTUAL TABLE temp.users USING csv(data='abc', comma='"')`)
if err == nil {
2023-11-23 15:32:28 +00:00
t.Fatal("want error")
2023-11-23 09:54:18 +00:00
} else {
t.Log(err)
}
err = db.Exec(`CREATE VIRTUAL TABLE temp.users USING csv(data='abc', header=tru)`)
if err == nil {
2023-11-23 15:32:28 +00:00
t.Fatal("want error")
2023-11-23 09:54:18 +00:00
} else {
t.Log(err)
}
}