Skip to main content

Modules/_sqlite/connection.c (part 4)

Source:

cpython 3.14 @ ab2d84fe1023/Modules/_sqlite/connection.c

This annotation covers the high-level connection interface. See modules_sqlite3_detail for sqlite3.connect, Connection.__init__, row factories, and Connection.close.

Map

LinesSymbolRole
1-100Connection.executeShortcut: create cursor and execute in one call
101-200Connection.executemanyExecute a statement with multiple parameter sequences
201-300text_factoryControl how TEXT columns are decoded
301-400isolation_levelAutocommit vs. deferred transaction mode
401-600Connection.create_functionRegister a Python callable as a SQL function

Reading

Connection.execute

// CPython: Modules/_sqlite/connection.c:480 pysqlite_connection_execute
static PyObject *
pysqlite_connection_execute(pysqlite_Connection *self, PyObject *args)
{
/* Shortcut: conn.execute(sql, params) == conn.cursor().execute(sql, params) */
PyObject *cursor = pysqlite_connection_cursor(self, NULL);
if (cursor == NULL) return NULL;
PyObject *result = pysqlite_cursor_execute((pysqlite_Cursor *)cursor, args);
if (result == NULL) { Py_DECREF(cursor); return NULL; }
Py_DECREF(result);
return cursor;
}

conn.execute(sql) is a convenience wrapper. It creates a temporary cursor, executes the SQL, and returns the cursor (not the result). The cursor is suitable for iteration: for row in conn.execute('SELECT ...').

text_factory

// CPython: Modules/_sqlite/connection.c:680 pysqlite_connection_set_text_factory
static int
pysqlite_connection_set_text_factory(pysqlite_Connection *self, PyObject *factory)
{
if (!PyCallable_Check(factory)) {
PyErr_SetString(PyExc_TypeError, "text_factory must be a callable");
return -1;
}
Py_XDECREF(self->text_factory);
self->text_factory = Py_NewRef(factory);
return 0;
}

conn.text_factory = bytes returns raw bytes for TEXT columns instead of str. conn.text_factory = lambda x: x.decode('latin-1') applies custom decoding. The default is str. Used when the database contains binary data stored as TEXT.

isolation_level

// CPython: Modules/_sqlite/connection.c:740 pysqlite_connection_set_isolation_level
static int
pysqlite_connection_set_isolation_level(pysqlite_Connection *self, PyObject *isolation_level)
{
if (isolation_level == Py_None) {
/* autocommit mode */
Py_XDECREF(self->isolation_level);
self->isolation_level = NULL;
pysqlite_connection_commit(self, NULL);
} else {
/* "DEFERRED", "IMMEDIATE", or "EXCLUSIVE" */
const char *level = PyUnicode_AsUTF8(isolation_level);
...
self->isolation_level = Py_NewRef(isolation_level);
}
return 0;
}

isolation_level=None enables autocommit (each statement commits immediately). The default "" uses BEGIN DEFERRED before DML statements. Setting isolation_level='EXCLUSIVE' uses BEGIN EXCLUSIVE for write-ahead-log optimization.

Connection.create_function

// CPython: Modules/_sqlite/connection.c:820 pysqlite_connection_create_function
static PyObject *
pysqlite_connection_create_function(pysqlite_Connection *self, PyObject *args,
PyObject *kwargs)
{
const char *name;
int narg, deterministic = 0;
PyObject *func;
/* Register func as a SQL scalar function named 'name' with 'narg' args */
sqlite3_create_function_v2(
self->db, name, narg,
SQLITE_UTF8 | (deterministic ? SQLITE_DETERMINISTIC : 0),
func, _pysqlite_func_callback, NULL, NULL,
_destructor);
Py_RETURN_NONE;
}

conn.create_function('md5', 1, hashlib.md5) registers hashlib.md5 as a SQL function: SELECT md5(col) FROM t. deterministic=True hints to SQLite that the function always returns the same value for the same inputs, enabling query optimization.

gopy notes

Connection.execute is module/sqlite3.ConnectionExecute in module/sqlite3/module.go. text_factory is stored as objects.Object and called via objects.CallOneArg when decoding TEXT columns. isolation_level controls whether BEGIN is issued before DML. create_function registers a Go closure as a cgo sqlite3_create_function callback.