diff options
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/func.go')
-rw-r--r-- | vendor/github.com/ncruces/go-sqlite3/func.go | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/vendor/github.com/ncruces/go-sqlite3/func.go b/vendor/github.com/ncruces/go-sqlite3/func.go index ab486e79a..7ff740df2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/func.go +++ b/vendor/github.com/ncruces/go-sqlite3/func.go @@ -33,16 +33,23 @@ func (c *Conn) CollationNeeded(cb func(db *Conn, name string)) error { // one or more unknown collating sequences. func (c Conn) AnyCollationNeeded() error { r := c.call("sqlite3_anycollseq_init", uint64(c.handle), 0, 0) - return c.error(r) + if err := c.error(r); err != nil { + return err + } + c.collation = nil + return nil } // CreateCollation defines a new collating sequence. // // https://sqlite.org/c3ref/create_collation.html func (c *Conn) CreateCollation(name string, fn func(a, b []byte) int) error { + var funcPtr uint32 defer c.arena.mark()() namePtr := c.arena.string(name) - funcPtr := util.AddHandle(c.ctx, fn) + if fn != nil { + funcPtr = util.AddHandle(c.ctx, fn) + } r := c.call("sqlite3_create_collation_go", uint64(c.handle), uint64(namePtr), uint64(funcPtr)) return c.error(r) @@ -52,9 +59,12 @@ func (c *Conn) CreateCollation(name string, fn func(a, b []byte) int) error { // // https://sqlite.org/c3ref/create_function.html func (c *Conn) CreateFunction(name string, nArg int, flag FunctionFlag, fn ScalarFunction) error { + var funcPtr uint32 defer c.arena.mark()() namePtr := c.arena.string(name) - funcPtr := util.AddHandle(c.ctx, fn) + if fn != nil { + funcPtr = util.AddHandle(c.ctx, fn) + } r := c.call("sqlite3_create_function_go", uint64(c.handle), uint64(namePtr), uint64(nArg), uint64(flag), uint64(funcPtr)) @@ -71,10 +81,13 @@ type ScalarFunction func(ctx Context, arg ...Value) // // https://sqlite.org/c3ref/create_function.html func (c *Conn) CreateWindowFunction(name string, nArg int, flag FunctionFlag, fn func() AggregateFunction) error { + var funcPtr uint32 defer c.arena.mark()() - call := "sqlite3_create_aggregate_function_go" namePtr := c.arena.string(name) - funcPtr := util.AddHandle(c.ctx, fn) + if fn != nil { + funcPtr = util.AddHandle(c.ctx, fn) + } + call := "sqlite3_create_aggregate_function_go" if _, ok := fn().(WindowFunction); ok { call = "sqlite3_create_window_function_go" } @@ -184,11 +197,12 @@ func callbackAggregate(db *Conn, pAgg, pApp uint32) (AggregateFunction, uint32) // We need to create the aggregate. fn := util.GetHandle(db.ctx, pApp).(func() AggregateFunction)() - handle := util.AddHandle(db.ctx, fn) if pAgg != 0 { + handle := util.AddHandle(db.ctx, fn) util.WriteUint32(db.mod, pAgg, handle) + return fn, handle } - return fn, handle + return fn, 0 } func callbackArgs(db *Conn, arg []Value, pArg uint32) { |