Documentation
¶
Overview ¶
Package sqlite is a SQLite driver for database/sql that needs no cgo.
It registers itself as "sqlite":
db, err := sql.Open("sqlite", "file:app.db?_pragma=journal_mode(WAL)&_pragma=busy_timeout(5000)")
modernc.org/sqlite and github.com/glebarez/go-sqlite register the same name, so a program that imports one of them as well panics at start. Use sql.OpenDB(sqlite.NewConnector(dsn)) to open a database without the registered name.
The data source name ¶
A file name, ":memory:", or a URI ("file:app.db?mode=ro"), which SQLite reads itself (https://sqlite.org/uri.html). These parameters are the driver's and SQLite does not see them:
- _pragma=name(value): a PRAGMA run on every new connection, in order. It may be given more than once.
- _txlock=deferred, immediate or exclusive: how BEGIN starts a transaction (deferred by default). A read-only transaction always starts deferred.
- _time_format=sqlite: how a time.Time is written. The only format, and the default, is "2006-01-02 15:04:05.999999999-07:00".
A connection waits 5 seconds for a lock unless a _pragma sets busy_timeout.
Index ¶
- Variables
- func Register(opts ...Option)
- type Aggregate
- type Connector
- type Driver
- type Func
- type FuncFlag
- type IndexConstraint
- type IndexInfo
- type IndexOp
- type IndexOrderBy
- type IndexUsage
- type ModuleFlag
- type Option
- func Join(opts ...Option) Option
- func WithAggregate(name string, nArg int, newAggregate func() Aggregate, flags ...FuncFlag) Option
- func WithCollation(name string, cmp func(a, b string) int) Option
- func WithFunction(name string, nArg int, fn Func, flags ...FuncFlag) Option
- func WithModule(name string, connect func(args []string) (VTable, error), flags ...ModuleFlag) Option
- func WithWindow(name string, nArg int, newWindow func() Window, flags ...FuncFlag) Option
- type VCursor
- type VSavepointer
- type VTable
- type VTransactor
- type VUpdater
- type Window
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrUnusablePlan = errors.New("sqlite: no usable plan for the virtual table")
ErrUnusablePlan is what BestIndex returns when the scan cannot work with the constraints it was given.
Functions ¶
Types ¶
type Aggregate ¶
Aggregate is the state of one group of an aggregate function written in Go. Step runs for each row of the group, with arguments as a Func gets them, then Final once, with a result as a Func gives it. An error or a panic in either is the error of the statement.
type Connector ¶
type Connector struct {
// contains filtered or unexported fields
}
Connector opens connections to one database.
func NewConnector ¶
NewConnector parses dsn, for sql.OpenDB. Its connections get what Register gave, then opts.
type Driver ¶
type Driver struct{}
Driver is the database/sql driver.
type Func ¶
Func is a SQL function written in Go.
Its arguments are copies, each an int64, float64, string, []byte or nil, so it may keep them. It returns a value database/sql can bind (an integer, float, bool, string, []byte, time.Time, nil or a driver.Valuer), or an error, which becomes the error of the statement. A panic in it is recovered and becomes the error of the statement too: the connection stays good.
It may run on any connection of its connector, and from several goroutines at once. It must not use the database: it runs in the middle of a statement. It may also run more than once for the same row: SQLite does not promise how often it calls a function, and group commit runs a batch again when a failure of one statement ended its transaction. Keep side effects out of it, or make them safe to repeat.
type FuncFlag ¶
type FuncFlag int
FuncFlag tells SQLite how a function behaves.
const ( // Deterministic: the same arguments always give the same result, so // SQLite may compute it once, and use it in indexes and generated // columns. Deterministic FuncFlag = csqlite.FuncDeterministic // DirectOnly: the function may be called only from SQL the program // runs, never from a trigger, view, index or generated column of the // schema. Give it to a function with side effects, so that a database // file someone else made cannot call it. DirectOnly FuncFlag = csqlite.FuncDirectOnly // Innocuous: the function has no side effects and reveals nothing, so // it is safe wherever SQL comes from. Innocuous FuncFlag = csqlite.FuncInnocuous )
type IndexConstraint ¶ added in v0.1.3
IndexConstraint is a term of the WHERE clause: column Op value. A constraint that is not Usable may not get an ArgvIndex.
type IndexInfo ¶ added in v0.1.3
type IndexInfo struct {
Constraints []IndexConstraint
OrderBy []IndexOrderBy
// ColUsed has bit i set when the statement uses column i, and bit 63
// for any column from 63 up.
ColUsed uint64
// Usage is as long as Constraints, one for each.
Usage []IndexUsage
// IdxNum and IdxStr name the plan for Filter.
IdxNum int
IdxStr string
// OrderByConsumed says the scan gives its rows in the order of OrderBy.
OrderByConsumed bool
EstimatedCost float64
EstimatedRows int64
// Unique says the scan gives at most one row.
Unique bool
}
IndexInfo is the question BestIndex answers. Constraints, OrderBy and ColUsed are the question. The rest is the answer, with SQLite's defaults in EstimatedCost and EstimatedRows.
type IndexOp ¶ added in v0.1.3
type IndexOp int
IndexOp is the operator of a constraint.
const ( IndexEQ IndexOp = csqlite.IndexEQ IndexGT IndexOp = csqlite.IndexGT IndexLE IndexOp = csqlite.IndexLE IndexLT IndexOp = csqlite.IndexLT IndexGE IndexOp = csqlite.IndexGE IndexMatch IndexOp = csqlite.IndexMatch IndexLike IndexOp = csqlite.IndexLike IndexGlob IndexOp = csqlite.IndexGlob IndexRegexp IndexOp = csqlite.IndexRegexp IndexNE IndexOp = csqlite.IndexNE IndexIsNot IndexOp = csqlite.IndexIsNot IndexIsNotNull IndexOp = csqlite.IndexIsNotNull IndexIsNull IndexOp = csqlite.IndexIsNull IndexIs IndexOp = csqlite.IndexIs IndexLimit IndexOp = csqlite.IndexLimit IndexOffset IndexOp = csqlite.IndexOffset )
The operators of IndexConstraint.
type IndexOrderBy ¶ added in v0.1.3
IndexOrderBy is a term of the ORDER BY clause.
type IndexUsage ¶ added in v0.1.3
IndexUsage is what BestIndex says of a constraint. ArgvIndex > 0 hands its value to Filter, at args[ArgvIndex-1]: give each used constraint its own number from 1 up. Omit says the scan only gives rows that meet it, so SQLite need not check them again.
type ModuleFlag ¶ added in v0.1.3
type ModuleFlag int
ModuleFlag tells SQLite how a module behaves.
const ( // EponymousOnly: the module is only used by its name, as a function // whose arguments are its hidden columns (a table-valued function such // as generate_series). CREATE VIRTUAL TABLE with it fails. Without the // flag, the module serves only CREATE VIRTUAL TABLE. EponymousOnly ModuleFlag = csqlite.ModEponymousOnly // ModuleDirectOnly: its tables may be used only by SQL the program // runs and by temp triggers and views, never by a trigger or a view // stored in a database. Give it to a module that reaches // outside the database, such as one that reads files, so that a // database file someone else made cannot use it. It cannot go with // ModuleInnocuous: a table has one of the two. ModuleDirectOnly ModuleFlag = csqlite.ModDirectOnly // ModuleInnocuous: the module has no side effects and reveals nothing, // so its tables are safe wherever SQL comes from. ModuleInnocuous ModuleFlag = csqlite.ModInnocuous // ModuleWritable: its tables take INSERT, UPDATE and DELETE when they are // VUpdaters. Those statements never merge with others in group commit: // the table's own transaction is outside what a merged batch can undo. // It cannot go with EponymousOnly. ModuleWritable ModuleFlag = csqlite.ModWritable )
type Option ¶
type Option struct {
// contains filtered or unexported fields
}
An Option adds something to the connections of a connector: give it to NewConnector, or to Register for the connectors sql.Open makes.
func Join ¶
Join makes one Option of several, applied in order: how a package of functions hands them over.
func WithAggregate ¶
WithAggregate makes an aggregate function name of nArg arguments: for each group, newAggregate makes a state. A group of no rows gets one too, for Final alone.
func WithCollation ¶
WithCollation makes cmp the collation name, for COLLATE name in queries and in the schema. cmp returns a negative number, 0 or a positive number as a sorts before, with or after b, and must be a total order. A panic in cmp fails the statement with the panic, and SQLite undoes it as it does when memory runs out: it rolls back the statement, or the whole transaction. When the whole transaction is gone, the next statements of it and its Commit fail. The connection stays good.
func WithFunction ¶
WithFunction makes fn the SQL function name of nArg arguments (-1 for any number) on every connection of the connector. A later option of the same name and nArg replaces an earlier one.
Example ¶
//go:build ((linux || darwin) && (amd64 || arm64)) || (windows && amd64)
package main
import (
"database/sql"
"database/sql/driver"
"fmt"
"strings"
"github.com/liustack/sqlite"
)
type longest struct{ s string }
func (l *longest) Step(args []driver.Value) error {
if s, ok := args[0].(string); ok && len(s) > len(l.s) {
l.s = s
}
return nil
}
func (l *longest) Final() (driver.Value, error) { return l.s, nil }
func main() {
reverse := func(args []driver.Value) (driver.Value, error) {
s, _ := args[0].(string)
r := []rune(s)
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r), nil
}
c, err := sqlite.NewConnector(":memory:",
sqlite.WithFunction("reverse", 1, reverse, sqlite.Deterministic),
sqlite.WithAggregate("longest", 1, func() sqlite.Aggregate { return &longest{} }),
sqlite.WithCollation("nocase_go", func(a, b string) int {
return strings.Compare(strings.ToLower(a), strings.ToLower(b))
}))
if err != nil {
panic(err)
}
db := sql.OpenDB(c)
defer db.Close()
var r, l, first string
err = db.QueryRow(`
WITH w(word) AS (VALUES ('Banana'), ('apple'), ('cherry'))
SELECT reverse('stressed'), longest(word),
(SELECT word FROM w ORDER BY word COLLATE nocase_go LIMIT 1)
FROM w`).Scan(&r, &l, &first)
if err != nil {
panic(err)
}
fmt.Println(r, l, first)
}
Output: desserts Banana apple
func WithModule ¶ added in v0.1.3
func WithModule(name string, connect func(args []string) (VTable, error), flags ...ModuleFlag) Option
WithModule makes a virtual table module name on every connection of the connector. connect makes a table for CREATE VIRTUAL TABLE t USING name(args...), and when a connection first uses such a table, or, for an EponymousOnly module, for its name used as a table, with no args. args are the arguments as SQL wrote them, without quotes taken off. A later option of the same name replaces an earlier one.
type VCursor ¶ added in v0.1.3
type VCursor interface {
// Filter starts the scan with the plan BestIndex chose: idxNum and
// idxStr as it set them, and args the values of the constraints it gave
// an ArgvIndex, args[ArgvIndex-1] for each. The values are copies, as
// a Func gets them. Filter may run again on the same cursor, to start
// over.
Filter(idxNum int, idxStr string, args []driver.Value) error
// Next goes to the next row.
Next() error
// EOF says the scan is past its last row. It runs after Filter and
// after each Next.
EOF() bool
// Column is column i of the row, a value as a Func returns.
Column(i int) (driver.Value, error)
// RowID is the rowid of the row.
RowID() (int64, error)
Close() error
}
VCursor is a scan of a VTable.
type VSavepointer ¶ added in v0.1.3
VSavepointer is a VTransactor that keeps savepoints, so that a statement that fails inside a transaction is undone in the table too: Savepoint(n) marks the state, RollbackTo(n) goes back to the state at savepoint n, and Release(n) forgets the marks from n on. A table that joined the transaction after savepoint n was opened has no mark for it: RollbackTo(n) then goes back to the state at Begin.
type VTable ¶ added in v0.1.3
type VTable interface {
// Schema is the CREATE TABLE statement of its columns, such as
// "CREATE TABLE x(value, start HIDDEN)". The name of the table in it
// is not used. A HIDDEN column is not in SELECT *, and when the module
// is used by its name as a function, its arguments give the hidden
// columns, in order: they reach BestIndex as constraints of EQ.
Schema() string
// BestIndex chooses how to scan the table under the constraints of
// info, and says what the scan costs. SQLite may ask several times
// with different constraints and runs the cheapest. It returns
// ErrUnusablePlan when the scan cannot work with the constraints that
// are usable, such as when an argument it needs is missing.
BestIndex(info *IndexInfo) error
// Open makes a cursor for a scan.
Open() (VCursor, error)
// Disconnect ends the table on its connection.
Disconnect() error
}
VTable is a table of a virtual table module, written in Go, on one connection. It only reads, unless its module is ModuleWritable and it is also a VUpdater.
Each connection connects a table of its own, and uses it from one goroutine at a time. Something the tables of several connections share is used from several goroutines at once. Like a Func, a table must not use the database.
type VTransactor ¶ added in v0.1.3
VTransactor is a VUpdater that takes part in the transactions of its connection. Begin runs before the first write of the table in a transaction, and as CREATE VIRTUAL TABLE makes the table. Sync, then Commit, run at the commit, or Rollback at the rollback. A failed Sync fails the commit. Commit runs after the database committed, so its error is lost: write what must last in Sync. Without VTransactor, a statement that fails leaves what it wrote to the table.
type VUpdater ¶ added in v0.1.3
type VUpdater interface {
// Insert adds a row of the values cols. rowid is nil when the
// statement gave none, and Insert chooses one. It returns the rowid of
// the row, which last_insert_rowid() and LastInsertId give. In a table
// declared WITHOUT ROWID, rowid is always nil, the key is in cols, and
// the number returned only goes to last_insert_rowid().
Insert(rowid driver.Value, cols []driver.Value) (int64, error)
// Update changes the row oldRowid to newRowid and cols.
Update(oldRowid, newRowid driver.Value, cols []driver.Value) error
Delete(rowid driver.Value) error
}
VUpdater is a VTable that takes INSERT, UPDATE and DELETE, of a module made with ModuleWritable. A rowid is an int64, or in a table declared WITHOUT ROWID the value of its PRIMARY KEY. Column values come as a Func's arguments. The table does not learn the statement's ON CONFLICT clause: an error fails the statement, also in INSERT OR IGNORE.
type Window ¶ added in v0.1.3
type Window interface {
Aggregate
Value() (driver.Value, error)
Inverse(args []driver.Value) error
}
Window is the state of one partition of an aggregate window function written in Go, used with OVER. As the frame moves, Step adds a row that came into it and Inverse takes out a row that left it, with the arguments Step had for that row. Value gives the result for the rows in the frame, and may be asked when the frame has no rows. Final runs once at the end of the partition, and gives the result when the function is used without OVER.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
ext
|
|
|
csv
Package csv gives SQLite the csv virtual table of SQLite's csv extension (ext/misc/csv.c), ported to Go:
|
Package csv gives SQLite the csv virtual table of SQLite's csv extension (ext/misc/csv.c), ported to Go: |
|
hash
Package hash gives SQLite hash functions:
|
Package hash gives SQLite hash functions: |
|
internal/arg
Package arg reads the arguments of the functions of ext/.
|
Package arg reads the arguments of the functions of ext/. |
|
internal/sqltest
Package sqltest runs the queries of the tests of ext/.
|
Package sqltest runs the queries of the tests of ext/. |
|
regexp
Package regexp gives SQLite the REGEXP operator and regexp functions, with Go's regexp syntax (RE2: no backreferences, and time linear in the text).
|
Package regexp gives SQLite the REGEXP operator and regexp functions, with Go's regexp syntax (RE2: no backreferences, and time linear in the text). |
|
series
Package series gives SQLite generate_series, the table-valued function of SQLite's series extension (ext/misc/series.c), ported to Go:
|
Package series gives SQLite generate_series, the table-valued function of SQLite's series extension (ext/misc/series.c), ported to Go: |
|
stats
Package stats gives SQLite the variance and the standard deviation as aggregate functions:
|
Package stats gives SQLite the variance and the standard deviation as aggregate functions: |
|
unicode
Package unicode gives SQLite case rules for every script, where SQLite's own upper, lower and NOCASE know only ASCII:
|
Package unicode gives SQLite case rules for every script, where SQLite's own upper, lower and NOCASE know only ASCII: |
|
uuid
Package uuid gives SQLite the functions of SQLite's own uuid extension:
|
Package uuid gives SQLite the functions of SQLite's own uuid extension: |
|
vec
Package vec gives SQLite vector functions, for similarity search over vectors kept in ordinary tables:
|
Package vec gives SQLite vector functions, for similarity search over vectors kept in ordinary tables: |
|
internal
|
|
|
extapi
Package extapi gives the packages of ext/ what the driver does not offer its users.
|
Package extapi gives the packages of ext/ what the driver does not offer its users. |
|
goasm/gen/cmd/engine
command
|
|
|
goasm/gen/cmd/gen
command
|
|
|
goversion
Package goversion stops a build with a Go newer than the one the engine was checked with.
|
Package goversion stops a build with a Go newer than the one the engine was checked with. |
|
replhook
Package replhook gives the replicator (replica/internal/capture) what it needs of the driver and the driver does not offer its users.
|
Package replhook gives the replicator (replica/internal/capture) what it needs of the driver and the driver does not offer its users. |
|
vfs
Package vfs is the operating system layer of SQLite, in Go: the files, locks and shared memory that os_unix.c gives a normal build.
|
Package vfs is the operating system layer of SQLite, in Go: the files, locks and shared memory that os_unix.c gives a normal build. |
|
Package replica copies a database of the driver to S3 (AWS S3, Cloudflare R2, MinIO and the other stores that speak its API) as it changes, so that it can be restored after the machine is lost.
|
Package replica copies a database of the driver to S3 (AWS S3, Cloudflare R2, MinIO and the other stores that speak its API) as it changes, so that it can be restored after the machine is lost. |
|
internal/capture
Package capture copies each change of a database in WAL mode into LTX files in a local staging folder, from which the replicator uploads them, and runs the database's checkpoints, so that no frame is checkpointed before it is copied.
|
Package capture copies each change of a database in WAL mode into LTX files in a local staging folder, from which the replicator uploads them, and runs the database's checkpoints, so that no frame is checkpointed before it is copied. |
|
internal/s3
Package s3 is the small client of the S3 protocol the replicator uses: PUT, multipart upload, ranged GET, ListObjectsV2 and DELETE, signed with SigV4, against AWS S3 and the stores that speak its protocol (Cloudflare R2, MinIO and the like).
|
Package s3 is the small client of the S3 protocol the replicator uses: PUT, multipart upload, ranged GET, ListObjectsV2 and DELETE, signed with SigV4, against AWS S3 and the stores that speak its protocol (Cloudflare R2, MinIO and the like). |
|
internal/s3test
Package s3test gives tests an S3 store:
|
Package s3test gives tests an S3 store: |