Skip to content

Commit 016a609

Browse files
committed
sqlite3: fix setconfig to propagate actual SQLite error
When sqlite3_db_config() returns a non-OK result, propagate the actual SQLite error instead of replacing it with a generic 'Unable to set config' message, to match CPython's set_error_from_db() behavior. Assisted-by: GitHub Copilot:claude-sonnet-4-6
1 parent 134999f commit 016a609

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

crates/stdlib/src/_sqlite3.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,14 @@ mod _sqlite3 {
162162
SQLITE_CREATE_TABLE, SQLITE_CREATE_TEMP_INDEX, SQLITE_CREATE_TEMP_TABLE,
163163
SQLITE_CREATE_TEMP_TRIGGER, SQLITE_CREATE_TEMP_VIEW, SQLITE_CREATE_TRIGGER,
164164
SQLITE_CREATE_VIEW, SQLITE_CREATE_VTABLE, SQLITE_DBCONFIG_DEFENSIVE,
165-
SQLITE_DBCONFIG_DQS_DDL, SQLITE_DBCONFIG_DQS_DML, SQLITE_DBCONFIG_ENABLE_FKEY,
166-
SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION,
167-
SQLITE_DBCONFIG_ENABLE_QPSG, SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_DBCONFIG_ENABLE_VIEW,
165+
SQLITE_DBCONFIG_DQS_DDL, SQLITE_DBCONFIG_DQS_DML, SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE,
166+
SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE, SQLITE_DBCONFIG_ENABLE_COMMENTS,
167+
SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,
168+
SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_DBCONFIG_ENABLE_QPSG,
169+
SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_DBCONFIG_ENABLE_VIEW,
168170
SQLITE_DBCONFIG_LEGACY_ALTER_TABLE, SQLITE_DBCONFIG_LEGACY_FILE_FORMAT,
169171
SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_DBCONFIG_RESET_DATABASE,
172+
SQLITE_DBCONFIG_REVERSE_SCANORDER, SQLITE_DBCONFIG_STMT_SCANSTATUS,
170173
SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_DBCONFIG_TRUSTED_SCHEMA,
171174
SQLITE_DBCONFIG_WRITABLE_SCHEMA, SQLITE_DELETE, SQLITE_DENY, SQLITE_DETACH,
172175
SQLITE_DROP_INDEX, SQLITE_DROP_TABLE, SQLITE_DROP_TEMP_INDEX, SQLITE_DROP_TEMP_TABLE,
@@ -1530,15 +1533,14 @@ mod _sqlite3 {
15301533
enable: OptionalArg<bool>,
15311534
vm: &VirtualMachine,
15321535
) -> PyResult<()> {
1533-
let enable = enable.unwrap_or(true) as c_int;
1536+
let db = self.db_lock(vm)?;
15341537
if !is_int_dbconfig(op) {
15351538
return Err(vm.new_value_error(format!("unknown config 'op': {op}")));
15361539
}
1537-
let db = self.db_lock(vm)?;
1540+
let enable = enable.unwrap_or(true) as c_int;
15381541
let mut actual: c_int = 0;
15391542
let rc = unsafe { sqlite3_db_config(db.db, op, enable, &mut actual) };
1540-
db.check(rc, vm)
1541-
.map_err(|_| new_operational_error(vm, "Unable to set config".to_owned()))?;
1543+
db.check(rc, vm)?;
15421544
if enable != actual {
15431545
return Err(new_operational_error(vm, "Unable to set config".to_owned()));
15441546
}
@@ -1547,10 +1549,10 @@ mod _sqlite3 {
15471549

15481550
#[pymethod]
15491551
fn getconfig(&self, op: c_int, vm: &VirtualMachine) -> PyResult<bool> {
1552+
let db = self.db_lock(vm)?;
15501553
if !is_int_dbconfig(op) {
15511554
return Err(vm.new_value_error(format!("unknown config 'op': {op}")));
15521555
}
1553-
let db = self.db_lock(vm)?;
15541556
let mut current: c_int = 0;
15551557
let rc = unsafe { sqlite3_db_config(db.db, op, -1, &mut current) };
15561558
db.check(rc, vm)?;
@@ -3536,6 +3538,11 @@ mod _sqlite3 {
35363538
| SQLITE_DBCONFIG_ENABLE_VIEW
35373539
| SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
35383540
| SQLITE_DBCONFIG_TRUSTED_SCHEMA
3541+
| SQLITE_DBCONFIG_STMT_SCANSTATUS
3542+
| SQLITE_DBCONFIG_REVERSE_SCANORDER
3543+
| SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE
3544+
| SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE
3545+
| SQLITE_DBCONFIG_ENABLE_COMMENTS
35393546
)
35403547
}
35413548

0 commit comments

Comments
 (0)