direct-sqlite-2.3.16: Low-level binding to SQLite3. Includes UTF8 and BLOB support.

Safe HaskellNone




Connection management

Simple query execution

exec :: Database -> Text -> IO () Source

Execute zero or more SQL statements delimited by semicolons.

execPrint :: Database -> Text -> IO () Source

Like exec, but print result rows to stdout.

This is mainly for convenience when experimenting in GHCi. The output format may change in the future.

execWithCallback :: Database -> Text -> ExecCallback -> IO () Source

Like exec, but invoke the callback for each result row.

type ExecCallback Source


 = ColumnCount

Number of columns, which is the number of items in the following lists. This will be the same for every row.

-> [Text]

List of column names. This will be the same for every row.

-> [Maybe Text]

List of column values, as returned by columnText.

-> IO () 

Statement management

prepare :: Database -> Text -> IO Statement Source

Unlike exec, prepare only executes the first statement, and ignores subsequent statements.

If the query string contains no SQL statements, this fails.

prepareUtf8 :: Database -> Utf8 -> IO Statement Source

It can help to avoid redundant Utf8 to Text conversion if you already have Utf8

If the query string contains no SQL statements, this fails.

reset :: Statement -> IO () Source

Note that in the C API, sqlite3_reset returns an error code if the most recent sqlite3_step indicated an error. We do not replicate that behavior here. reset never throws an exception.

clearBindings :: Statement -> IO () Source

Set all parameters in the prepared statement to null.

Parameter and column information

bindParameterCount :: Statement -> IO ParamIndex Source

This returns the index of the largest (rightmost) parameter. Note that this is not necessarily the number of parameters. If numbered parameters like ?5 are used, there may be gaps in the list.

See ParamIndex for more information.

bindParameterName :: Statement -> ParamIndex -> IO (Maybe Text) Source

Return the N-th SQL parameter name.

Named parameters are returned as-is. E.g. ":v" is returned as Just ":v". Unnamed parameters, however, are converted to Nothing.

Note that the parameter index starts at 1, not 0.

columnName :: Statement -> ColumnIndex -> IO (Maybe Text) Source

Return the name of a result column. If the column index is out of range, return Nothing.

Binding values to a prepared statement

bindSQLData :: Statement -> ParamIndex -> SQLData -> IO () Source

If the index is not between 1 and bindParameterCount inclusive, this fails with ErrorRange. Otherwise, it succeeds, even if the query skips this index by using numbered parameters.


> stmt <- prepare conn "SELECT ?1, ?3, ?5"
> bindSQLData stmt 1 (SQLInteger 1)
> bindSQLData stmt 2 (SQLInteger 2)
> bindSQLData stmt 6 (SQLInteger 6)
*** Exception: SQLite3 returned ErrorRange while attempting to perform bind int64.
> step stmt >> columns stmt
[SQLInteger 1,SQLNull,SQLNull]

bind :: Statement -> [SQLData] -> IO () Source

Convenience function for binding values to all parameters. This will fail if the list has the wrong number of parameters.

bindNamed :: Statement -> [(Text, SQLData)] -> IO () Source

Convenience function for binding named values to all parameters. This will fail if the list has the wrong number of parameters or if an unknown name is used.


stmt <- prepare conn "SELECT :foo + :bar"
bindNamed stmt [(":foo", SQLInteger 1), (":bar", SQLInteger 2)]

Reading the result row

Warning: column and columns will throw a DecodeError if any TEXT datum contains invalid UTF-8.

typedColumns :: Statement -> [Maybe ColumnType] -> IO [SQLData] Source

This avoids extra API calls using the list of column types. If passed types do not correspond to the actual types, the values will be converted according to the rules at If the list contains more items that number of columns, the result is undefined.

columnText :: Statement -> ColumnIndex -> IO Text Source

This will throw a DecodeError if the datum contains invalid UTF-8. If this behavior is undesirable, you can use columnText from Database.SQLite3.Direct, which does not perform conversion to Text.

Result statistics

changes :: Database -> IO Int Source

Return the number of rows that were changed, inserted, or deleted by the most recent INSERT, DELETE, or UPDATE statement.

Create custom SQL functions

createFunction Source


:: Database 
-> Text

Name of the function.

-> Maybe ArgCount

Number of arguments. Nothing means that the function accepts any number of arguments.

-> Bool

Is the function deterministic?

-> (FuncContext -> FuncArgs -> IO ())

Implementation of the function.

-> IO ()

Create a custom SQL function or redefine the behavior of an existing function. If the function is deterministic, i.e. if it always returns the same result given the same input, you can set the boolean flag to let sqlite perform additional optimizations.

createAggregate Source


:: Database 
-> Text

Name of the function.

-> Maybe ArgCount

Number of arguments.

-> a

Initial aggregate state.

-> (FuncContext -> FuncArgs -> a -> IO a)

Process one row and update the aggregate state.

-> (FuncContext -> a -> IO ())

Called after all rows have been processed. Can be used to construct the returned value from the aggregate state.

-> IO () 

Like createFunction except that it creates an aggregate function.

deleteFunction :: Database -> Text -> Maybe ArgCount -> IO () Source

Delete an SQL function (scalar or aggregate).

Extract function arguments

Set the result of a function

Create custom collations

createCollation Source


:: Database 
-> Text

Name of the collation.

-> (Text -> Text -> Ordering)

Comparison function.

-> IO () 

deleteCollation :: Database -> Text -> IO () Source

Delete a collation.

Interrupting a long-running query

interrupt :: Database -> IO () Source

Cause any pending operation on the Database handle to stop at its earliest opportunity. This simply sets a flag and returns immediately. It does not wait for the pending operation to finish.

You'll need to compile with -threaded for this to do any good. Without -threaded, FFI calls block the whole RTS, meaning interrupt would never run at the same time as step.

interruptibly :: Database -> IO a -> IO a Source

Make it possible to interrupt the given database operation with an asynchronous exception. This only works if the program is compiled with base >= 4.3 and -threaded.

It works by running the callback in a forked thread. If interrupted, it uses interrupt to try to stop the operation.

Incremental blob I/O

blobOpen Source


:: Database 
-> Text

The symbolic name of the database (e.g. "main").

-> Text

The table name.

-> Text

The column name.

-> Int64

The ROWID of the row.

-> Bool

Open the blob for read-write.

-> IO Blob

Open a blob for incremental I/O.

blobRead Source


:: Blob 
-> Int

Number of bytes to read.

-> Int

Offset within the blob.

-> IO ByteString 

blobReadBuf :: Blob -> Ptr a -> Int -> Int -> IO () Source

blobWrite Source


:: Blob 
-> ByteString 
-> Int

Offset within the blob.

-> IO () 

Online Backup API

backupInit Source


:: Database

Destination database handle

-> Text

Destination database name

-> Database

Source database handle

-> Text

Source database name

-> IO Backup 


data SQLError Source

Exception thrown when SQLite3 reports an error.

direct-sqlite may throw other types of exceptions if you misuse the API.




sqlError :: !Error

Error code returned by API call

sqlErrorDetails :: Text

Text describing the error

sqlErrorContext :: Text

Indicates what action produced this error, e.g. exec "SELECT * FROM foo"

data FuncContext Source

The context in which a custom SQL function is executed.

data FuncArgs Source

The arguments of a custom SQL function.

data Blob Source

The type of blob handles used for incremental blob I/O


data Backup Source

A handle for an online backup process.


Results and errors

data StepResult Source



data BackupStepResult Source



There are still more pages to be copied.


All pages were successfully copied.

data Error Source



Successful result


SQL error or missing database


Internal logic error in SQLite


Access permission denied


Callback routine requested an abort


The database file is locked


A table in the database is locked


A malloc() failed


Attempt to write a readonly database


Operation terminated by sqlite3_interrupt()


Some kind of disk I/O error occurred


The database disk image is malformed


Unknown opcode in sqlite3_file_control()


Insertion failed because database is full


Unable to open the database file


Database lock protocol error


Database is empty


The database schema changed


String or BLOB exceeds size limit


Abort due to constraint violation


Data type mismatch


Library used incorrectly


Uses OS features not supported on host


Authorization denied


Auxiliary database format error


2nd parameter to sqlite3_bind out of range


File opened that is not a database file


sqlite3_step() has another row ready


sqlite3_step() has finished executing

Special integers

newtype ParamIndex Source

Index of a parameter in a parameterized query. Parameter indices start from 1.

When a query is prepared, SQLite allocates an array indexed from 1 to the highest parameter index. For example:

>Right stmt <- prepare conn "SELECT ?1, ?5, ?3, ?"
>bindParameterCount stmt
ParamIndex 6

This will allocate an array indexed from 1 to 6 (? takes the highest preceding index plus one). The array is initialized with null values. When you bind a parameter with bindSQLData, it assigns a new value to one of these indices.

See for the syntax of parameter placeholders, and how parameter indices are assigned.


ParamIndex Int 


Bounded ParamIndex

Limit min/max bounds to fit into SQLite's native parameter ranges.

Enum ParamIndex 
Eq ParamIndex 
Integral ParamIndex 
Num ParamIndex 
Ord ParamIndex 
Real ParamIndex 
Show ParamIndex

This just shows the underlying integer, without the data constructor.

FFIType ParamIndex CParamIndex 

newtype ColumnIndex Source

Index of a column in a result set. Column indices start from 0.


ColumnIndex Int 


Bounded ColumnIndex

Limit min/max bounds to fit into SQLite's native parameter ranges.

Enum ColumnIndex 
Eq ColumnIndex 
Integral ColumnIndex 
Num ColumnIndex 
Ord ColumnIndex 
Real ColumnIndex 
Show ColumnIndex

This just shows the underlying integer, without the data constructor.

FFIType ColumnIndex CColumnIndex 

type ColumnCount = ColumnIndex Source

Number of columns in a result set.

newtype ArgCount Source

Number of arguments of a user defined SQL function.


ArgCount Int 


Bounded ArgCount 
Enum ArgCount 
Eq ArgCount 
Integral ArgCount 
Num ArgCount 
Ord ArgCount 
Real ArgCount 
Show ArgCount

This just shows the underlying integer, without the data constructor.

FFIType ArgCount CArgCount 

type ArgIndex = ArgCount Source

Index of an argument to a custom function. Indices start from 0.