diff options
author | Erlend Egeberg Aasland <erlend.aasland@innova.no> | 2021-06-02 12:26:06 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-02 12:26:06 (GMT) |
commit | a384b6c04054a2c5050a99059836175cf73e2016 (patch) | |
tree | e55ca9e7067504c22ae77a5ba6df21e4312cd5b3 /Modules/_sqlite/statement.c | |
parent | ee7637596d8de25f54261bbeabc602d31e74f482 (diff) | |
download | cpython-a384b6c04054a2c5050a99059836175cf73e2016.zip cpython-a384b6c04054a2c5050a99059836175cf73e2016.tar.gz cpython-a384b6c04054a2c5050a99059836175cf73e2016.tar.bz2 |
bpo-44165: Optimise sqlite3 statement preparation by passing string size (GH-26206)
Diffstat (limited to 'Modules/_sqlite/statement.c')
-rw-r--r-- | Modules/_sqlite/statement.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index 3a18ad8..c4a790c 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -66,6 +66,12 @@ pysqlite_statement_create(pysqlite_Connection *connection, PyObject *sql) Py_TYPE(sql)->tp_name); return NULL; } + + int max_length = sqlite3_limit(connection->db, SQLITE_LIMIT_LENGTH, -1); + if (sql_cstr_len >= max_length) { + PyErr_SetString(pysqlite_DataError, "query string is too large"); + return PYSQLITE_TOO_MUCH_SQL; + } if (strlen(sql_cstr) != (size_t)sql_cstr_len) { PyErr_SetString(PyExc_ValueError, "the query contains a null character"); @@ -106,7 +112,7 @@ pysqlite_statement_create(pysqlite_Connection *connection, PyObject *sql) Py_BEGIN_ALLOW_THREADS rc = sqlite3_prepare_v2(self->db, sql_cstr, - -1, + (int)sql_cstr_len + 1, &self->st, &tail); Py_END_ALLOW_THREADS |